【发布时间】:2016-09-26 21:50:07
【问题描述】:
我遇到了一种(不是很不寻常的)情况,我不得不使用map() 或列表理解表达式。然后我想知道哪个更快。
ThisStackOverflow 的回答为我提供了解决方案,但后来我开始自己测试。基本上结果是一样的,但是我在切换到 Python 3 时发现了一个我很好奇的意外行为,即:
λ iulian-pc ~ → python --version
Python 2.7.6
λ iulian-pc ~ → python3 --version
Python 3.4.3
λ iulian-pc ~ → python -mtimeit '{}'
10000000 loops, best of 3: 0.0306 usec per loop
λ iulian-pc ~ → python3 -mtimeit '{}'
10000000 loops, best of 3: 0.105 usec per loop
λ iulian-pc ~ → python -mtimeit 'dict()'
10000000 loops, best of 3: 0.103 usec per loop
λ iulian-pc ~ → python3 -mtimeit 'dict()'
10000000 loops, best of 3: 0.165 usec per loop
我假设 Python 3 比 Python 2 快,但在几篇文章(1、2)中证明并非如此。然后我想也许 Python 3.5 在这样一个简单的任务上会表现得更好,正如他们在README 中所说的那样:
语言大致相同,但有很多细节,尤其是如何 像字典和字符串这样的内置对象工作,已经改变 相当大,许多已弃用的功能终于被 删除。
但不,它的表现更差:
λ iulian-pc ~ → python3 --version
Python 3.5.0
λ iulian-pc ~ → python3 -mtimeit '{}'
10000000 loops, best of 3: 0.144 usec per loop
λ iulian-pc ~ → python3 -mtimeit 'dict()'
1000000 loops, best of 3: 0.217 usec per loop
我尝试深入研究dict 的 Python 3.5 源代码,但我对 C 语言的了解不足以自己找到答案(或者,我什至没有在正确的地方搜索)。
所以,我的问题是:
在相对简单的任务(例如 dict 定义)上,与旧版 Python 相比,新版 Python 的速度慢的原因是什么,按照常识,反之亦然?我知道这些差异是如此之小,以至于在大多数情况下它们可以被忽略。这只是一个观察,让我很好奇为什么时间增加了,至少没有保持不变?
【问题讨论】:
-
请注意,
dict()是一个函数调用。这需要查找dict函数然后调用它,这显然比不需要查找的内置语法有更多的开销。 -
@Bakuriu,我知道,我只是为了表明文字和构造函数符号都有增加。
-
现在继续寻找
python -m timeit 1在 cpython 版本之间变化的原因。
标签: python python-2.7 python-3.x dictionary python-internals