Тож я грав з 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()
його використанні використовується більше пам'яті.
І 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
ОНОВЛЕННЯ No2
Тест з 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
.