函数调用总会产生一些开销.但为什么下面的代码显示非函数调用较慢.
码:
import time
def s():
for i in range(1000000000):
1 + 1
t = time.time()
s()
print("Function call: " + str(time.time() - t))
t = time.time()
for i in range(1000000000):
1 + 1
print("Non function call: " + str(time.time() - t))
输出:
Function call: 38.39736223220825
Non function call: 60.33238506317139
您可能会认为,由于循环仅执行1 1,因此应该没有太大区别.但是,这里有一个“隐藏的”
assignment通常被遗忘:你的for循环中的循环变量i.这是经济放缓的原因.
在函数中,这是通过STORE_FAST完成的.在顶层,它是用STORE_NAME完成的.第一个比另一个快,并且在一个运行1000000000次的循环中,这个差异非常清楚地显示出来.
请记住,函数调用只发生一次.因此,它的开销在这种特定情况下并没有真正贡献.
除此之外,所有其他步骤只发生一次并且几乎相同.创建一个范围并抓取其迭代器,并为每次迭代加载常量2.
您始终可以使用dis module来检查为每个生成的CPython字节码,[email protected],您有:
dis.dis(s)
# snipped for brevity