gpt4 book ai didi

python - Python 代码在函数中运行得更快是真的吗?

转载 作者:太空狗 更新时间:2023-10-29 21:32:10 26 4
gpt4 key购买 nike

我看到一条评论让我想到了这个问题 Why does Python code run faster in a function? .

我开始思考,并认为我会使用 timeit 自己尝试一下库,但是我得到了非常不同的结果:

(注意:10**8 已更改为 10**7 以加快速度)

>>> from timeit import repeat
>>> setup = """
def main():
for i in xrange(10**7):
pass
"""
>>> stmt = """
for i in xrange(10**7):
pass
"""
>>> min(repeat('main()', setup, repeat=7, number=10))
1.4399558753975725
>>> min(repeat(stmt, repeat=7, number=10))
1.4410973942722194
>>> 1.4410973942722194 / 1.4399558753975725
1.000792745732109
  • 我是否正确使用了 timeit
  • 为什么这些结果彼此之间的差异不到 0.1%,而另一个问题的结果却相差近 250%?
  • 是否只有在使用 CPython 编译版本的 Python(如 Cython)时才会有所不同?
  • 最终:Python 代码在函数中真的更快,还是仅仅取决于您如何计时?

最佳答案

你的测试中的缺陷是 timeit 编译你的 stmt 代码的方式。它实际上是在以下模板中编译的:

template = """
def inner(_it, _timer):
%(setup)s
_t0 = _timer()
for _i in _it:
%(stmt)s
_t1 = _timer()
return _t1 - _t0
"""

因此 stmt 实际上是在函数中运行,使用 faSTLocals 数组(即 STORE_FAST)。

这是一个测试,你的函数在问题中作为 f_opt 与未优化的编译 stmt 在函数 f_no_opt 中执行:

>>> code = compile(stmt, '<string>', 'exec')
>>> f_no_opt = types.FunctionType(code, globals())

>>> t_no_opt = min(timeit.repeat(f_no_opt, repeat=10, number=10))
>>> t_opt = min(timeit.repeat(f_opt, repeat=10, number=10))
>>> t_opt / t_no_opt
0.4931101445632647

关于python - Python 代码在函数中运行得更快是真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com