【发布时间】:2017-06-25 17:39:22
【问题描述】:
复制一个洗牌的range(10**6) 列表十次需要我大约 0.18 秒:(这是五次运行)
0.175597017661
0.173731403198
0.178601711594
0.180330912952
0.180811964451
将未洗牌的列表复制十次大约需要 0.05 秒:
0.058402235973
0.0505464636856
0.0509734306934
0.0526022752744
0.0513324916184
这是我的测试代码:
from timeit import timeit
import random
a = range(10**6)
random.shuffle(a) # Remove this for the second test.
a = list(a) # Just an attempt to "normalize" the list.
for _ in range(5):
print timeit(lambda: list(a), number=10)
我也试过用a[:]复制,结果差不多(就是速度差很大)
为什么速度差异很大?我知道并理解著名的Why is it faster to process a sorted array than an unsorted array? 示例中的速度差异,但在这里我的处理没有决定。只是盲目地复制列表中的引用,不是吗?
我在 Windows 10 上使用 Python 2.7.12。
编辑:现在也尝试了 Python 3.5.2,结果几乎相同(始终在 0.17 秒左右混洗,在 0.05 秒左右始终未混洗)。这是代码:
a = list(range(10**6))
random.shuffle(a)
a = list(a)
for _ in range(5):
print(timeit(lambda: list(a), number=10))
【问题讨论】:
-
请不要对我大喊大叫,我是来帮你的!更改顺序后,我在每个测试的每次迭代中得到大约
0.25。所以在我的平台上,顺序很重要。 -
@vaultah 谢谢,但我现在已经读过了,我不同意。当我看到那里的代码时,我立刻想到了ints的cache hits/misses,这也是作者的结论。但他的代码添加数字,这需要查看它们。我的代码没有。我的只需要复制引用,而不是通过它们访问。
-
@vaultah 的链接中有一个完整的答案(你现在有点不同意,我明白了)。但无论如何我仍然认为我们不应该将python用于低级功能,因此需要担心。不过这个话题还是很有趣的,谢谢。
-
@NikolayProkopyev 是的,我并不担心,只是在做其他事情时注意到这一点,无法解释,并且很好奇。我很高兴我现在提出并得到了答案:-)