我创建了两个列表l1和l2,但是每个列表都有不同的创建方法:
l1
l2
import sys l1 = [None] * 10 l2 = [None for _ in range(10)] print('Size of l1 =', sys.getsizeof(l1)) print('Size of l2 =', sys.getsizeof(l2))
但是输出使我感到惊讶:
Size of l1 = 144 Size of l2 = 192
使用列表推导创建的列表在内存中更大,但是在Python中这两个列表相同。
这是为什么?这是CPython内部的东西,还是其他解释?
在编写时[None] * 10,Python知道它将需要一个正好包含10个对象的列表,因此它会精确地分配该对象。
[None] * 10
当您使用列表推导时,Python不知道它需要多少。因此,随着元素的添加,列表逐渐增加。对于每个重新分配,它分配的空间都超过了立即需要的空间,因此不必为每个元素重新分配。结果列表可能会比所需的要大一些。
比较具有相似大小的列表时,可以看到此行为:
>>> sys.getsizeof([None]*15) 184 >>> sys.getsizeof([None]*16) 192 >>> sys.getsizeof([None for _ in range(15)]) 192 >>> sys.getsizeof([None for _ in range(16)]) 192 >>> sys.getsizeof([None for _ in range(17)]) 264
您可以看到第一种方法只分配需要的内容,而第二种则周期性地增长。在此示例中,它为16个元素分配了足够的内存,并且在达到第17个元素时不得不重新分配。