我在做一些分析,使用两种不同的方法来连接不同长度的列表,使用不同的Python版本。
在Python 2中使用list
:
$ python -m timeit -s "li1=range(10**4); li2=range(10**4)" "li1 += li2"
10000 loops, best of 3: 55.3 usec per loop
$ python -m timeit -s "li1=range(10**6); li2=range(10**6)" "li1 += li2"
100 loops, best of 3: 9.81 msec per loop
在Python 3中使用
+=
:$ python3 -m timeit -s "li1=list(range(10**4)); li2=list(range(10**4))" "`li1 += li2`"
10000 loops, best of 3: 60 usec per loop
$ python3 -m timeit -s "li1=list(range(10**6)); li2=list(range(10**6))" "`li1 += li2`"
100 loops, best of 3: 11 msec per loop
在Python 2中使用
+=
:$ python -m timeit -s "li1=range(10**4); li2=range(10**4)" "li1.extend(li2)"
10000 loops, best of 3: 59 usec per loop
$ python -m timeit -s "li1=range(10**6); li2=range(10**6)" "li1.extend(li2)"
100 loops, best of 3: 10.3 msec per loop
在Python 3中使用
extend
:$ python3 -m timeit -s "li1=list(range(10**4)); li2=list(range(10**4))" "li1.extend(li2)"
10000 loops, best of 3: 64.1 usec per loop
$ python3 -m timeit -s "li1=list(range(10**6)); li2=list(range(10**6))" "li1.extend(li2)"
100 loops, best of 3: 11.3 msec per loop
我很惊讶地注意到,Python 3比Python 2慢得多,而且跳跃幅度很大。
另一件很有趣的事情是做
extend
比做+=
快得多。是否有任何实现理由证明上述观察结果是正确的,特别是在Python 2和Python 3之间?
最佳答案
我很惊讶地注意到,Python 3比Python 2慢得多,而且跳跃幅度很大。
正如其他人指出的那样,您的基准测试不支持Python 3速度慢得多的说法。9.81毫秒对11毫秒,10.3毫秒对11.3毫秒?
有记录的事实是,Python 3比Python 2慢一点。What's new document表示性能:
3.0泛化的最终结果是,Python 3.0运行pystone基准测试的速度比Python 2.5慢10%。最可能的最大原因是为小整数移除了特殊的外壳。还有改进的空间,但3.0发布后会有改进!
另一件很有趣的事情是做+=
比做extend
快得多。
再一次,“更快得多”被夸大了。9.81毫秒对10.3毫秒?
有关答案,请参见this related SO question。extend
需要Python级的函数调用,vs+=
可以在C级进行优化,因此速度稍快。