Jestem ciekawy, jak zarządzanie pamięcią różni się między Bytearray a listą w Pythonie.Różnica między Bytearray i List w Pythonie
Znalazłem kilka pytań, takich jak Difference between bytearray and list, ale nie odpowiada dokładnie na moje pytanie.
Moje pytanie precyzyjnie ...
from array import array
>>> x = array("B", (1,2,3,4))
>>> x.__sizeof__()
36
>>> y = bytearray((1,2,3,4))
>>> y.__sizeof__()
32
>>> z = [1,2,3,4]
>>> z.__sizeof__()
36
Jak widać istnieje różnica w wielkości między listy/array.array (36 bajtów dla 4 elementów) oraz tablica bajtów (32 bajtów dla 4 elementów). Czy ktoś może mi wyjaśnić, dlaczego tak się dzieje? Ma to sens w przypadku tablicy bajtów, która zajmuje 32
bajtów pamięci dla elementów 4
(4 * 8 == 32)
, ale jak można to zinterpretować dla list i array.array?
# Lets take the case of bytearray (which makes more sense to me at least :p)
for i in y:
print(i, ": ", id(i))
1 : 499962320
2 : 499962336 #diff is 16 units
3 : 499962352 #diff is 16 units
4 : 499962368 #diff is 16 units
Dlaczego różnica między dwoma sąsiadującymi elementami różnią 16
jednostek tutaj, gdy każdy element zajmuje tylko 8
bajtów. Czy to oznacza, że każdy wskaźnik adresu pamięci wskazuje na skubanie?
Również jakie są kryteria alokacji pamięci dla liczby całkowitej? Czytałem, że Python przydzieli więcej pamięci na podstawie wartości liczby całkowitej (popraw mnie, jeśli się mylę), jak im większa liczba, tym więcej pamięci.
Np
>>> y = 10
>>> y.__sizeof__()
14
>>> y = 1000000
>>> y.__sizeof__()
16
>>> y = 10000000000000
>>> y.__sizeof__()
18
jakie są kryteria, które Python przydziela pamięć?
I dlaczego Python zajmuje o wiele więcej pamięci, podczas gdy C
zajmuje tylko 8 bajtów (moja to maszyna 64-bitowa)? kiedy są idealnie poniżej zakresu liczb całkowitych (2 ** 64)
?
Metadane:
Python version:'3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]'
arch Maszyna: 64-bitowy
PS: Prosimy kierować mnie do dobrego artykułu, gdzie zarządzanie pamięcią Python jest wyjaśnione lepiej. Spędziłem prawie godzinę, aby wymyślić te rzeczy i w końcu zadałem to pytanie w SO. :(
Dobre pytanie, przegłosowano. Hej, masz szczęście: na 64-bitowej maszynie Linux Xubuntu CPython 3.4.3 'y .__ sizeof __()' daje '28' dla' y = 10', to samo dla 'y = 1M',' 32' dla 'y = 10000000000000' – Pynchia
Hi @Pynchia, Mine to 32-bitowy python, chociaż mój komputer ma 64-bitową. Nie jestem pewien, ale to może być powód. Pozwala poczekać, aż ktoś wyjaśni. –