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,并且安装了每个 Python 的 32 位和 64 位版本。虽然在内存访问的限制范围内,给定版本的 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 又比这慢了大约 10%。
我的问题:是否有环境选项或设置可以纠正这个问题,或者只是低效的代码或解释器为 Python 3 版本做了更多的工作?
答案似乎是 Python 3 使用了在 Python 2.x 中曾经被称为“long”的“无限精度”整数,它的默认“int”类型没有任何使用 Python 2 固定位长“int”和正如下面的答案和评论中所讨论的那样,处理这些可变长度的“int”需要额外的时间。
可能是 Python 3.4 比 Python 3.3 慢一些,因为为支持同步而对内存分配进行了更改,这使得内存分配/释放速度稍慢,这可能是当前版本的“长”处理运行速度较慢的主要原因。
最佳答案
差异是由于更换了int
输入 long
类型。显然,长整数运算会变慢,因为 long
操作比较复杂。
如果您通过设置 cnt
强制 python2 使用 longs至 0L
差异消失了:
$python2 -mtimeit -n5 -r2 -s"cnt=0L" "for i in range(10000000): cnt += 1L"
5 loops, best of 2: 1.1 sec per loop
$python3 -mtimeit -n5 -r2 -s"cnt=0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: 686 msec per loop
$python2 -mtimeit -n5 -r2 -s"cnt=0L" "for i in xrange(10000000): cnt += 1L"
5 loops, best of 2: 714 msec per loop
正如你在我的机器上看到的,python3.4 比使用
range
的两个 python2 都快并使用 xrange
使用时 long
s。 python 的最后一个基准测试 2 xrange
表明这种情况下的差异很小。我没有安装 python3.3,所以我无法在 3.3 和 3.4 之间进行比较,但据我所知,这两个版本之间没有重大变化(关于
range
),所以时间应该大致相同。如果您看到显着差异,请尝试使用 dis
检查生成的字节码模块。内存分配器( PEP 445 )发生了变化,但我不知道是否修改了默认内存分配器以及对性能有哪些影响。
关于python - Python 3 的枚举速度是否比 Python 2 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23453133/