【发布时间】:2014-06-20 14:43:06
【问题描述】:
对于最小循环的枚举,Python 3 似乎比 Python 2 慢很多,随着 Python 3 的更新版本,这种情况似乎变得更糟。
我在我的 64 位 Windows 机器(Intel i7-2700K - 3.5 GHz)上安装了 Python 2.7.6、Python 3.3.3 和 Python 3.4.0,每个机器都有 32 位和 64 位版本安装了 Python。虽然对于给定版本在内存访问限制范围内,32 位和 64 位之间的执行速度没有显着差异,但不同版本级别之间存在非常显着的差异。我会让计时结果自己说话:
C:\**Python34_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **900 msec** per loop
C:\**Python33_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **820 msec** per loop
C:\**Python27_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **480 msec** per loop
由于 Python 3 的“范围”与 Python 2 的“范围”不同,并且在功能上与 Python 2 的“xrange”相同,因此我也将其计时如下:
C:\**Python27_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in **xrange**(10000000): cnt += 1"
5 loops, best of 2: **320 msec** per loop
可以很容易地看出,3.3 版的速度几乎是 2.7 版的两倍,而 Python 3.4 又比 2.7 慢了大约 10%。
我的问题:是否有解决此问题的环境选项或设置,还是只是低效的代码或解释器为 Python 3 版本做的更多?
答案似乎是 Python 3 使用了在 Python 2.x 中被称为“long”的“无限精度”整数,它的默认“int”类型没有任何使用 Python 2 固定位长度的选项” int”,并且处理这些可变长度的“int”会花费额外的时间,如下面的答案和 cmets 中所述。
Python 3.4 可能比 Python 3.3 慢一些,因为为了支持同步而对内存分配进行了更改,导致内存分配/释放速度稍慢,这可能是当前版本的“长”处理运行速度较慢的主要原因。
【问题讨论】:
-
至少因为在 Python 3 中,整数的默认类型是
long long -
我同意frostnational。尝试在 python2 基准测试中将
cnt = 0更改为cnt = 0L,看看这是否会有所不同。我刚刚在我的机器上尝试过,python3 比 python2 的range快两倍,比 python 2xrange快 30%快(至少在我的盒子上)。 -
@frostnational,不,比“long long”或 64 位但“无限精度”整数更差,它具有表示给定值所需的字节数/字数。如果可能的话,除了等待 Python 优化实现之外,似乎没有其他方法可以恢复速度。
标签: python performance loops python-2.7 python-3.x