我正在使用此功能,该功能是我在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个程序之间的差异,并显示内存和可能的运行时间方面的差异。