2016-10-07 2 views
1
>>> from sys import getsizeof 
>>> a=[i for i in range(1000)] 
>>> b={i for i in range(1000)} 
>>> getsizeof(a) 
9024 
>>> getsizeof(b) 
32992 

私の質問は、リストがリストに比べるとずっと多くのメモリを消費するのはなぜですか?リストは順序付けされ、セットは順序付けされません。それはメモリを消費するセットの内部構造ですか?または、リストにポインタが含まれていて、セットに含まれていないのですか?またはsys.getsizeofが間違っていますか?タプル、リスト、辞書について質問はありましたが、リストとセットを比較することはできませんでした。リストのメモリ消費とPythonでの設定

答えて

2

listsetまたはdictの固有の違い、つまり要素が格納される方法のためだと思います。

Listは、元のオブジェクトへの参照のコレクションにすぎません。 1000個の整数を作成した後、1000個の整数オブジェクトが作成され、listにはこれらのオブジェクトへの参照しか含まれていないとします。

一方、setまたはdictionaryは、これら1000個の整数のハッシュ値を計算しなければならず、メモリは要素数に従って消費されます。

例:setdictの両方で、最小サイズは8です(つまり、3つの値しか保存していない場合でも、Pythonは8つの要素を割り当てます)。サイズを変更すると、バケットの数が4倍増加して50,000個の要素に達し、その後サイズが2倍増加します。

In [26]: a=[i for i in range(60000)] 
In [27]: b={i for i in range(60000)} 

In [30]: b1={i for i in range(100000)} 
In [31]: a1=[i for i in range(100000)] 

In [32]: getsizeof(a) 
Out[32]: 514568 
In [33]: getsizeof(b) 
Out[33]: 2097376 

In [34]: getsizeof(a1) 
Out[34]: 824464 
In [35]: getsizeof(b1) 
Out[35]: 4194528 

回答:これは、次の可能なサイズ、

16、64、256、1024、4096、16384、65536、131072、262144、...

いくつかの例を示します: はい、それは内部構造のため、多くのメモリを消費します。set要素を格納します。そして、sys.getsizeofは正しいです。ここでそれを使うことには何も問題ありません。 listsetまたはdictについてのより詳細な参考

this chapter

を参照してください。
関連する問題