我想要一个函数来生成一个长度为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>;1000000)。有没有更好的方法来编写这段代码,或者更好,有没有一个函数可以帮我完成这项任务
首先,我想指出,代码性能差的主要原因是这一行:
列表中间的时间复杂性
list.pop
大约为O(n)
,因为从列表中间弹出会迫使Python移动大量内存。这使得网络的复杂性O(n^2)
。您可以通过就地更改来大幅提高性能,例如:为了完整性,您可以使用向量化的
numpy
解决方案,或者使用前面提到的random.shuffle
来获得更好的性能。时间:@HeapOverflow建议将第二个循环替换为shuffle函数:
这比以前快了一个数量级。根据过去的经验,我怀疑列表上的pop函数相当慢,是第二个循环中的主要瓶颈
相关问题 更多 >
编程相关推荐