Использование памяти Python для временных процессов?
Я использую эту функцию, которую я нашел в Интернете по адресу: http://fa.bianp.net/blog/2013/different-ways-to-get-memory-consumption-or-lessons-learned-from-memory_profiler/
def memory_usage_psutil():
# return the memory usage in MB
import psutil
process = psutil.Process(os.getpid())
mem = process.memory_info()[0] / float(2 ** 20)
return mem
Это, кажется, работает отлично, однако я озадачен одним вопросом. Допустим, у нас есть такой сценарий:
def create_giant_list(num):
A = []
for i in range (num):
row = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' 'j' 'k','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' 'j' 'k','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' 'j' 'k']
A.append(row)
return A
A = create_giant_list(10000000) # Some HUGE list (Could contain larger sized objects though)
print("BEFORE: " + str(memory_usage_psutil()) + " MB")
test = [x for x in A] # List comprehension creates a new list!! More memory...
print("AFTER: " + str(memory_usage_psutil()) + " MB")
Ничего себе, мы получили хорошие результаты:
BEFORE: 173.66015625 MB
AFTER: 178.9921875 MB
Однако как насчет памяти, которая не назначена переменной?
print("BEFORE: " + str(memory_usage_psutil()) + " MB")
print([x for x in A])
print("AFTER: " + str(memory_usage_psutil()) + " MB")
Здесь мы просто печатаем список, а не присваиваем его переменной, которая была бы сохранена в памяти для нашей программы.
AFTER: 163.0078125 MB
BEFORE: 163.0078125 MB
Бесполезные результаты... так как мы фактически не храним этот список в памяти, он сразу же удаляется после печати. Но в какой-то момент этот список действительно существует и потребляет память, верно? Даже если это было временно.
Вопрос: Есть ли способ просмотреть память, которая временно используется? Я предполагаю, что особенно для больших наборов данных это может серьезно повлиять на память, но у меня возникают трудности с тестированием.
Почему: я пересматривал понимание списка по сравнению с генераторами. Я знаю, что когда происходит понимание списка, он создает новый экземпляр результирующего списка. Это может быть опасно и занимать много памяти для больших наборов данных. Следовательно, генератор может быть полезен, чтобы избежать этого. Я хотел написать простую программу, демонстрирующую различия между двумя, показывающую различия в памяти и возможном времени выполнения.