在 Python 2 和 Python 3 中使用 "+=" 与 "extend" 的列表连接



我正在做一些分析,使用两种不同的方法来list连接不同长度的列表,使用不同的Python版本。

Python 2 中使用 +=

$ 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 中使用 extend

$ 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  
  1. 我很惊讶地注意到 Python 3 比 Python 2 慢得多,而且跳跃是巨大的。
  2. 另一个非常有趣的事情是做+=比做extend要快得多。

有什么实现理由来证明上述观察结果的合理性,尤其是在Python 2和Python 3之间?

我很惊讶地注意到 Python 3 比 Python 2 慢得多,而且跳跃是巨大的。

正如其他人所指出的,你的基准测试不支持你关于Python 3慢得多的说法。 9.81 毫秒与 11 毫秒,10.3 毫秒与 11.3 毫秒?

Python

3 比 Python 2 慢一点,这是一个有据可查的事实是。 新增功能文档对性能进行了说明:

3.0 概括的最终结果是 Python 3.0 运行 pystone 基准测试的速度比 Python 2.5 慢约 10%。最大的原因很可能是删除了小整数的特殊大小写。还有改进的空间,但它会在 3.0 发布后发生!


另一件非常有趣的事情是做+=比做extend要快得多。

同样,"更快"被夸大了。 9.81毫秒与10.3毫秒?

有关答案,请参阅此相关的SO问题。 extend需要 Python 级别的函数调用,而+=可以在 C 级别进行优化,因此速度略快。

相关内容

  • 没有找到相关文章

最新更新