python - Python 3 的枚举速度是否比 Python 2 慢?

标签 python performance loops python-2.7 python-3.x

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/

相关文章:

python - 为什么在写入 csv 时 Pandas 会删除前导零?

Python Mastermind 游戏问题

python - 如何从 python 脚本运行 Windows 命令行?

mysql - 优化23张表的慢sql查询

performance - 使用加特林将条件放入 HTTP 请求中

r - 如何计算数据框每一行的相同值的条目?

python - Pygame.mixer.sound 的声音持续时间不够准确

c - -finline-limit GCC 编译器选项的确切行为

java - 如何使循环运行与用户输入一样多的次数?

javascript - 如何按一定时间间隔一次显示数组中的一个类?