gpt4 book ai didi

python - Python 是否优化循环中的函数调用?

转载 作者:IT老高 更新时间:2023-10-28 21:08:12 26 4
gpt4 key购买 nike

说,我有一个代码从循环中调用了数百万次的函数,我希望代码更快:

def outer_function(file):
for line in file:
inner_function(line)

def inner_function(line):
# do something
pass

不一定是文件处理,例如可以是从函数绘制线调用的函数绘制点。这个想法是,从逻辑上讲,这两者必须分开,但从性能的角度来看,它们应该尽快一起行动。

Python 会自动检测和优化这些事情吗?如果没有 - 有没有办法给它一个线索呢?也许使用一些额外的外部优化器?...

最佳答案

由于其动态特性,Python 不会内联函数调用。从理论上讲,inner_function 可以做一些事情,将名称 inner_function 重新绑定(bind)到其他东西 - Python 在编译时无法知道这可能会发生。例如:

def func1():
global inner_func
inner_func = func2
print 1

def func2():
print 2

inner_func = func1

for i in range(5):
inner_func()

打印:

1
2
2
2
2

你可能认为这很可怕。然后,再想一想——Python 的功能性和动态性是其最吸引人的特性之一。 Python 允许的许多功能都以性能为代价,在大多数情况下这是可以接受的。

也就是说,您可能可以使用 byteplay 之类的工具一起破解某些东西或类似的 - 将内部函数分解为字节码并将其插入外部函数,然后重新组装。再三考虑,如果您的代码对性能至关重要,足以保证进行此类黑客攻击,只需用 C 重写即可。Python 为 FFI 提供了很好的选择。


这一切都与官方的 CPython 实现有关。 运行时 JITting 解释器(如 PyPy 或可悲地不复存在的 Unladen Swallow)理论上可以检测正常情况并执行内联。唉,我对 PyPy 还不够熟悉,不知道它是否这样做,但它绝对可以。

关于python - Python 是否优化循环中的函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7243444/

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