我在使用list
对象时发现一个奇怪的事情,如果使用list()
创建list
,它会使用更多的内存,而使用列表推导式则不会? 我正在使用Python 3.5.2
In [1]: import sys
In [2]: a = list(range(100))
In [3]: sys.getsizeof(a)
Out[3]: 1008
In [4]: b = [i for i in range(100)]
In [5]: sys.getsizeof(b)
Out[5]: 912
In [6]: type(a) == type(b)
Out[6]: True
In [7]: a == b
Out[7]: True
In [8]: sys.getsizeof(list(b))
Out[8]: 1008
从文档中可以看出:
有几种方法可以构造列表:
- 使用一对方括号表示空列表:
[]
- 使用方括号,用逗号分隔项目:
[a]
、[a, b, c]
- 使用列表推导式:
[x for x in iterable]
- 使用类型构造函数:
list()
或list(iterable)
但似乎使用list()
会使用更多的内存。
随着列表变得越来越大,差距也会增加。
为什么会这样呢?
更新 #1
使用 Python 3.6.0b2 进行测试:
Python 3.6.0b2 (default, Oct 11 2016, 11:52:53)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getsizeof(list(range(100)))
1008
>>> sys.getsizeof([i for i in range(100)])
912
更新 #2
使用 Python 2.7.12 进行测试:
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getsizeof(list(xrange(100)))
1016
>>> sys.getsizeof([i for i in xrange(100)])
920
sys.getsizeof(list(range(100)))
为1016,getsizeof(range(100))
为872,而getsizeof([i for i in range(100)])
为920。它们都属于list
类型。 - Sven Ruschxrange
。 - RemcoGerlich