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

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

  • Использование профилирующей памяти в App Engine
  • Итеративно писать узлы XML в python
  • ошибка памяти в python
  • Theano: Инициализация устройства gpu не удалась! Причина = CNMEM_STATUS_OUT_OF_MEMORY
  • Как просмотреть базу данных sqlite в памяти в python
  • Как проверить использование памяти в iPython?
  • Как читать файл в обратном порядке в python3.2 без чтения всего файла в память?
  • Получите базу данных sqlite3 с диска, загрузите ее в память и сохраните на диск?
  • Python readlines () использование и эффективная практика для чтения
  • Позволяет ли освобождение обрабатываться по-разному для небольших / больших массивов numpy?
  • Использование памяти Python? загрузка больших словарей в память
  • Python - лучший язык программирования в мире.