我希望函数生成一个长度为n的列表,其中包含一个介于0到1之间的数字的算术序列,但要以随机顺序放置。
例如,对于功能
def randSequence(n):
...
return myList
randSequence(10)
退货
[0.5, 0.3, 0.9, 0.8, 0.6, 0.2, 0.4, 0.0, 0.1, 0.7]
和
randSequence(5)
退货
[0.4, 0.0, 0.2, 0.8, 0.6]
目前,我拥有它,因此它可以在一个循环中生成数字序列,并在另一个循环中将其随机化,如下所示:
def randSequence(n):
step = 1 / n
setList = []
myList = []
for i in range(n):
setList.append(i * step)
for i in range(n):
index = random.randint(0, len(setList) - 1)
myList.append(setList.pop(index))
return myList
不幸的是,这种解决方案很慢,尤其是对于大量的问题(例如n> 1,000,000)。有没有更好的方法来编写此代码,或者甚至更好,是否有可以为我完成此任务的函数?
问题来源:stackoverflow
首先,我想指出您的代码性能不佳的主要原因是由于以下原因:
myList.append(setList.pop(index))
列表中间的时间复杂度list.pop大约是O(n),因为从列表中间弹出会迫使Python移动一堆内存。这使得网络复杂度为O(n ^ 2)。您可以通过就地进行更改来大幅度提高性能,例如:
def randSequenceInplace(n):
'a.k.a. Fisher-Yates'
step = 1 / n
lst = [step * i for i in range(n)]
for i in range(n-1):
index = random.randint(i, n - 1)
lst[i], lst[index] = lst[index], lst[i]
# myList.append(setList.pop(index))
return lst
*为了完整起见,您可以使用矢量化numpy解决方案,也可以使用前面提到的random.shuffle以获得更好的性能。时间: n = 10*6 %time randSequence(n) # CPU times: user 1min 22s, sys: 33 ms, total: 1min 22s # Wall time: 1min 22s %time randSequenceInplace(n) # CPU times: user 1.33 s, sys: 1.91 ms, total: 1.33 s # Wall time: 1.33 s %timeit np.random.permutation(n) / n # 10 loops, best of 3: 22.4 ms per loop
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。