为什么这段使用 random.random 的特定代码在 Python 3.11 中比在 Python 3.10.6 中运行得慢?

mh0*_*h0w 3 python performance python-3.10 python-3.11

我只是想听听其他人对为什么这段特定代码在 Python 3.11 中运行速度可能比在 Python 3.10.6 中慢的想法。从这里交叉发布 。我是新来的 - 如果我做错了什么,请告诉我。

测试.py脚本:

import timeit
from random import random


def run():
    for i in range(100):
        j = random()


t = timeit.timeit(run, number=1000000)
print(t)
Run Code Online (Sandbox Code Playgroud)

命令:

(base) conda activate python_3_10_6

(python_3_10_6) python test.py
5.0430680999998

(python_3_10_6) conda activate python_3_11

(python_3_11) python test.py
5.801756700006081
Run Code Online (Sandbox Code Playgroud)

use*_*ica 7

这看起来可能是PEP 659 优化没有为random.random.

PEP 659 致力于 JIT 优化许多常见操作。(不是 JIT编译,但绝对是 JIT优化。)它对大多数 Python 代码都有好处,但我认为random.random没有涵盖。

random.random是用 C 编写的(隐藏实例的)方法random.Random,除了 之外没有其他参数self,因此它应该使用METH_NOARGS调用约定。此调用约定没有专门的快速路径。两者specialize_c_call都_Py_Specialize_Call只是退出,而不是专门进行呼叫。

当 PEP 659 没有得到回报时,支持它的工作只是开销。我不确定哪些部分贡献了多少开销,但由于生成PRECALL和CALL指令,字节码比以前更长(尽管我认为正在开展一些工作来改进这一点),再加上尝试专业化和跟踪何时尝试专业化有其自身的优势。自己的开销。