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