Я думал, что я улучшаю производительность, когда заменяю этот код:
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) до времени выполнения и является неизменным.Затем объект кода использует глобальную среду для достижения закрытия.Кажется, это говорит о том, что оптимизация, на которую я надеялся, не произойдет.