【发布时间】:2021-09-09 05:30:33
【问题描述】:
在 Python 3.9 中,嵌套函数比普通函数慢得惊人,在我的示例中约为 10%。
from timeit import timeit
def f():
return 0
def factory():
def g():
return 0
return g
g = factory()
print(timeit("f()", globals=globals()))
#> 0.074835498
print(timeit("g()", globals=globals()))
#> 0.08470309999999998
dis.dis 显示相同的字节码,我发现的唯一区别在于函数内部标志。事实上,dis.show_code 揭示了 g 有一个标志 NESTED 而f 没有。
但是,可以删除标志,它使g 与f 一样快。
import inspect
g.__code__ = g.__code__.replace(co_flags=g.__code__.co_flags ^ inspect.CO_NESTED)
print(timeit("f()", globals=globals()))
#> 0.07321161100000001
print(timeit("g()", globals=globals()))
#> 0.07439838800000001
我试图查看 CPython 代码以了解 CO_NESTED 标志如何影响函数执行,但我什么也没找到。与CO_NESTED 标志相比,这种性能差异有什么解释吗?
编辑:删除CO_NESTED 标志似乎也对函数执行没有影响,除了开销,即使它已捕获变量。
import inspect
global_var = 40
def factory():
captured_var = 2
def g():
return global_var + captured_var
return g
g = factory()
assert g() == 42
g.__code__ = g.__code__.replace(co_flags=g.__code__.co_flags ^ inspect.CO_NESTED)
assert g() == 42 # function still works as expected
【问题讨论】:
标签: python python-3.x performance optimization