Статическая память в 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.

3 Solutions collect form web for “Статическая память в python: делать циклы создавать новые экземпляры переменных в памяти?”

Без 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 является хорошим решением, если это то, что происходит в вашем случае.

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

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

Для очень больших значений 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) 

Извините, если ответ может не помочь

  • использование памяти модуля python
  • Использование профилирующей памяти в App Engine
  • Python readlines () использование и эффективная практика для чтения
  • Позволяет ли освобождение обрабатываться по-разному для небольших / больших массивов numpy?
  • ftp отправка потока байтов python
  • Python глубоко получает список с содержимым?
  • Обновление большой базы данных sqlite в кусках
  • Глубокая версия sys.getsizeof
  • Руководство по оптимизации времени выполнения Python для встроенных систем с низкими системными ресурсами
  • Как проверить использование памяти в iPython?
  • Как найти утечки в библиотеках ctypes Python
  • Python - лучший язык программирования в мире.