Tak więc bawiłem się z obiektami list
i znalazłem trochę dziwnej rzeczy, że jeśli list
zostanie utworzony z list()
, to zużywa więcej pamięci niż rozumienia list? Używam Python 3.5.2list() zużywa więcej pamięci niż rozumienie list
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
Z docs:
Listy mogą być wykonane na kilka sposobów:
- Korzystanie parę nawiasów kwadratowych do oznaczenia pustą listę :
[]
- Za pomocą nawiasów kwadratowych, rozdzielając elementy przecinkami:
[a]
,[a, b, c]
- Korzystanie z listy ze zrozumieniem:
[x for x in iterable]
- Korzystanie z konstruktora typu:
list()
lublist(iterable)
Ale wydaje się, że za pomocą list()
wykorzystuje więcej pamięci.
I tak jak list
jest większy, różnica wzrasta.
Dlaczego tak się dzieje?
Aktualizacja # 1
testu Pythona 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
Aktualizacja # 2
testu Pythona 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
To bardzo interesujące pytanie. Potrafię odtworzyć to zjawisko w Pythonie 3.4.3. Jeszcze bardziej interesujące: na Pythonie 2.7.5 'sys.getsizeof (lista (zakres (100))' jest 1016, 'getsizeof (zakres (100))' wynosi 872 i 'getsizeof ([i dla i w zakresie (100) ]) 'to 920. Wszystkie mają typ' list'. –
Interesujące jest to, że ta różnica jest również w Pythonie 2.7.10 (chociaż rzeczywiste liczby różnią się od Pythona 3). Również tam w 3.5 i 3.6b. – cdarke
Otrzymuję te same liczby dla Python 2.7.6 jako @SvenFestersen, także przy użyciu 'xrange'. – RemcoGerlich