Использование памяти 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

Бесполезные результаты... так как мы фактически не храним этот список в памяти, он сразу же удаляется после печати. Но в какой-то момент этот список действительно существует и потребляет память, верно? Даже если это было временно.

Вопрос: Есть ли способ просмотреть память, которая временно используется? Я предполагаю, что особенно для больших наборов данных это может серьезно повлиять на память, но у меня возникают трудности с тестированием.

Почему: я пересматривал понимание списка по сравнению с генераторами. Я знаю, что когда происходит понимание списка, он создает новый экземпляр результирующего списка. Это может быть опасно и занимать много памяти для больших наборов данных. Следовательно, генератор может быть полезен, чтобы избежать этого. Я хотел написать простую программу, демонстрирующую различия между двумя, показывающую различия в памяти и возможном времени выполнения.

0 ответов

Другие вопросы по тегам