Я запускаю скрипты 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)
Извините, если ответ не полезен