我正在做一些分析,使用两种不同的方法来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
- 我很惊讶地注意到 Python 3 比 Python 2 慢得多,而且跳跃是巨大的。
- 另一个非常有趣的事情是做
+=
比做extend
要快得多。
有什么实现理由来证明上述观察结果的合理性,尤其是在Python 2和Python 3之间?
我很惊讶地注意到 Python 3 比 Python 2 慢得多,而且跳跃是巨大的。
正如其他人所指出的,你的基准测试不支持你关于Python 3慢得多的说法。 9.81 毫秒与 11 毫秒,10.3 毫秒与 11.3 毫秒?
Python3 比 Python 2 慢一点,这是一个有据可查的事实是。 新增功能文档对性能进行了说明:
3.0 概括的最终结果是 Python 3.0 运行 pystone 基准测试的速度比 Python 2.5 慢约 10%。最大的原因很可能是删除了小整数的特殊大小写。还有改进的空间,但它会在 3.0 发布后发生!
另一件非常有趣的事情是做
+=
比做extend
要快得多。
同样,"更快"被夸大了。 9.81毫秒与10.3毫秒?
有关答案,请参阅此相关的SO问题。 extend
需要 Python 级别的函数调用,而+=
可以在 C 级别进行优化,因此速度略快。