哪些情况会导致 pypy 跑的比 cpython 更慢?

测试代码:

import hashlib
from pathlib import Path
import random


def get_string_md5(text: str) -> str:
    md5_encoder = hashlib.md5()
    md5_encoder.update(text.encode('utf-8'))
    return md5_encoder.hexdigest()


def tt():
    a = [
        get_string_md5(f'哈哈{random.randint(1, 100)}')
        for _ in range(10000000)
    ]
    assert 'dhquiwd' not in a

大致就是计算 随机字符串md5 码值 一千万次

在 cpython3.10 中的结果:

In [16]: time tt()
CPU times: user 11.3 s, sys: 175 ms, total: 11.5 s
Wall time: 11.5 s

In [17]:

耗时 11.5 s

pypy3.9 中的结果:

In [2]: time tt()
CPU times: user 28.1 s, sys: 268 ms, total: 28.3 s
Wall time: 28.4 s

耗时 28.4 s

可以看到, pypy 反而更慢了!

为什么?

阅读 2.6k
1 个回答

因为 PyPy 运行 RPython(Python 的一个子集)的时候会在执行代码之前会即时(JIT,Just In Time)编译它,而编译是需要花费时间的。

PyPy 与 CPython 的本质区别是:CPython 会将源代码转换为字节码(bytecode)执行;而 PyPy 则会在执行每一句之前将其编译为机器码(machine code),运行效率更高。其次,PyPy 的垃圾收集机制与 CPython 也不完全相同。

因此这种短小的代码片段并没有发挥出 PyPy 的优势所在,而那些被反复多次执行的代码则在 PyPy 中效率才能获得显著提升。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏