所以我玩list
對象,發現一點奇怪的事情,如果list
創建與list()
它使用更多的內存,比列表理解?我使用Python 3.5.2list()使用比列表理解更多的內存
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
從docs:
列表可以通過多種方式來構建:
- 使用方括號對來表示空列表:
[]
- 使用方括號,用逗號分隔項目:
[a]
,[a, b, c]
- 使用列表理解:
[x for x in iterable]
- 使用類型構造:
list()
或list(iterable)
但似乎使用list()
它使用更多的內存。
而且list
越大,差距就越大。
爲什麼出現這種情況?
UPDATE#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
這是一個非常有趣的問題。我可以在Python 3.4.3中重現這一現象。甚至更有趣的:關於Python 2.7.5'sys.getsizeof(列表(範圍(100)))'是1016,'getsizeof(範圍(100))'是872和'getsizeof([I爲i的範圍(100) ])'是920.所有的都有'list'類型。 –
感興趣的是,Python 2.7.10中也存在這種差異(儘管實際數字與Python 3不同)。還有在3.5和3.6b。 – cdarke
當使用'xrange'時,我得到的Python 2.7.6與@SvenFestersen相同。 – RemcoGerlich