Статическая память в python: делать циклы создавать новые экземпляры переменных в памяти?

Я запускаю скрипты Python, которые выполняют несколько вызовов для некоторых функций, например F1 (x) и F2 (x), которые выглядят примерно так:

x = LoadData()

for j in range(N):
    y = F1(x[j])
    z[j] = F2(y)

    del y

SaveData(z)

Производительность намного быстрее, если я держу линию "del y" . Но я не понимаю, почему это так. Если я не использую "del y" , я быстро исчерпал RAM и должен прибегать к виртуальной памяти, и все замедляется до ползания. Купите, если я использую "del y" , то я неоднократно промываю и перераспределяет память для y. То, что я хотел бы сделать, это заставить сидеть в качестве статической памяти и повторно использовать память при каждом вызове F1 (x). Но из того, что я могу сказать, это не то, что происходит.

Кроме того, не уверен, что это актуально, но мои данные состоят из массивов numpy.

Ответ 1

Без del y вам может понадобиться вдвое больше памяти. Это связано с тем, что для каждого прохождения через цикл y привязано к предыдущему значению F1, а следующий вычисляется.

один раз F1 возвращает y, возвращается к этому новому значению, и старый F1 результат может быть освобожден.

Это означает, что объект, возвращаемый F1, занимает довольно много памяти

Развертка цикла для первой пары итераций будет выглядеть так:

y = F1(x[0])   # F1(x[0]) is calculated, then y is bound to it
z[j] = F2(y)
y = F1(x[1])   # y is still bound to F1(x[0]) while F1(x[1]) is computed
               # The memory for F1(X[0]) is finally freed when y is rebound
z[j] = F2(y)

с помощью del y является хорошим решением, если это то, что происходит в вашем случае.

Ответ 2

то, что вы действительно хотите, это что-то странное в python - вы хотите выделить область памяти для y и передать указатель на этот регион на F1(), чтобы он мог использовать эту область для создания следующее значение y. это не позволяет F1() присвоить себе новое значение y, ссылка на которую затем записывается в вашу собственную переменную y (которая на самом деле не является значением любого F1(), но является ссылкой на она)

Там уже есть вопрос о передаче по ссылке в python: Как передать переменную по ссылке?

Ответ 3

Для очень больших значений N используйте xrange вместо range для сохранения памяти. Также вы можете вложить функции, но я не знаю, поможет ли это вам.:\

x = LoadData()

for j in xrange(N):
    z[j] = F2(F1(x[j]))

SaveData(z)

Возможно, F1 и F2 делают ненужные копии объектов, лучший способ был бы на месте, например:

x = LoadData()
for item in x:
    item.F1()
    item.F2()
SaveData(x)

Извините, если ответ не полезен