复制洗牌range(10**6)清单十次需要大约0.18秒:(这是五次运行)
0.175597017661
0.173731403198
0.178601711594
0.180330912952
0.180811964451
Run Code Online (Sandbox Code Playgroud)
将未洗牌的列表复制十次需要大约0.05秒:
0.058402235973
0.0505464636856
0.0509734306934
0.0526022752744
0.0513324916184
Run Code Online (Sandbox Code Playgroud)
这是我的测试代码:
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)
Run Code Online (Sandbox Code Playgroud)
我也尝试过复制a[:],结果相似(即速度差异很大)
为什么速度差异很大?我知道并理解着名的速度差异为什么处理排序数组比未排序数组更快?例如,但在这里我的处理没有决定.它只是盲目地复制列表中的引用,不是吗?
我在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))
Run Code Online (Sandbox Code Playgroud) 我对这两个函数进行了基准测试(它们将成对解压缩回源列表,来自这里):
n = 10**7
a = list(range(n))
b = list(range(n))
pairs = list(zip(a, b))
def f1(a, b, pairs):
a[:], b[:] = zip(*pairs)
def f2(a, b, pairs):
for i, (a[i], b[i]) in enumerate(pairs):
pass
Run Code Online (Sandbox Code Playgroud)
结果timeit.timeit(五轮,数字为秒):
f1 1.06 f2 1.57
f1 0.96 f2 1.69
f1 1.00 f2 1.85
f1 1.11 f2 1.64
f1 0.95 f2 1.63
Run Code Online (Sandbox Code Playgroud)
显然f1比 快很多f2,对吧?
但后来我也测量了timeit.default_timer并得到了完全不同的图片:
f1 7.28 f2 1.92
f1 5.34 f2 1.66
f1 6.46 f2 1.70
f1 …Run Code Online (Sandbox Code Playgroud)