临时进程的Python内存使用情况?

时间:2019-02-27 18:20:48

标签: python generator list-comprehension memory-consumption

我正在使用此功能,该功能是我在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

无济于事...由于我们实际上并未将此列表存储在内存中,因此在打印后会立即将其丢弃。但是,在某个时间点,该列表DID存在并且正在消耗内存,对吗?即使那是暂时的。

问题:我有什么办法可以查看临时使用的内存?我认为特别是对于大量数据,这可能会严重影响内存,但是我很难对此进行测试。

原因:我正在重新探索列表理解与生成器。我知道,当列表理解发生时,它将创建结果列表的新实例。这可能很危险,并且会占用大数据集的大量内存。因此,生成器可以避免这样做。我想编写一个简单的程序,演示这2个程序之间的差异,并显示内存和可能的运行时间方面的差异。

0 个答案:

没有答案