测试代码:
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 中效率才能获得显著提升。