Производительность закрытия функции

Я думал, что улучшу производительность, заменив этот код:

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

8
задан Chris Morgan 2 April 2012 в 00:16
поделиться