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

哪些情况会导致 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 反而更慢了!

为什么?


回答:

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

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

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

以上是 哪些情况会导致 pypy 跑的比 cpython 更慢? 的全部内容, 来源链接: utcz.com/p/938394.html

回到顶部