【发布时间】:2012-04-02 00:02:44
【问题描述】:
我认为替换这段代码可以提高性能:
def f(a, b):
return math.sqrt(a) * b
result = []
a = 100
for b in range(1000000):
result.append(f(a, b))
与:
def g(a):
def f(b):
return math.sqrt(a) * b
return f
result = []
a = 100
func = g(a)
for b in range(1000000):
result.append(func(b))
我假设由于在执行闭包时a 是固定的,解释器会预先计算涉及a 的所有内容,因此math.sqrt(a) 将只重复一次而不是1000000 次。
我的理解是否总是正确的,或者总是不正确的,或者是正确的/不正确的,取决于实现?
我注意到func 的代码对象是在运行时之前构建的(至少在 CPython 中),并且是不可变的。然后代码对象似乎使用全局环境来实现关闭。这似乎表明我希望的优化没有发生。
【问题讨论】:
-
实际上该代码不会运行,您调用
func时只有一个参数,尽管它有两个参数。
标签: python performance python-3.x closures implementation