擅长:python、mysql、java
<p>首先,我想指出,代码性能差的主要原因是这一行:</p>
<pre><code>myList.append(setList.pop(index))
</code></pre>
<p>列表中间的时间复杂性<code>list.pop</code>大约为<code>O(n)</code>,因为从列表中间弹出会迫使Python移动大量内存。这使得网络的复杂性<code>O(n^2)</code>。您可以通过就地更改来大幅提高性能,例如:</p>
<pre><code>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
</code></pre>
<hr/>
<p>为了完整性,您可以使用向量化的<code>numpy</code>解决方案,或者使用前面提到的<code>random.shuffle</code>来获得更好的性能。时间:</p>
<pre><code>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
</code></pre>