Я использую эту функцию, которую я нашел в Интернете по адресу: 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
Бесполезные результаты ... так как мы неНа самом деле этот список не сохраняется в памяти, он сразу же отбрасывается после печати.Но в какой-то момент этот список действительно существует и потребляет память, верно?Даже если это было временно.
Вопрос: Можно ли как-нибудь просмотреть память, которая временно используется?Я предполагаю, что особенно для больших наборов данных это может серьезно повлиять на память, но у меня возникают трудности с проверкой этого.
Почему: Я пересматривал понимание списков по сравнению с генераторами.Я знаю, что когда происходит понимание списка, он создает новый экземпляр результирующего списка.Это может быть опасно и занимать много памяти для больших наборов данных.Следовательно, генератор может быть полезен, чтобы избежать этого.Я хотел написать простую программу, демонстрирующую различия между двумя, показывающую различия в памяти и возможном времени выполнения.