list
とset
またはdict
の固有の違い、つまり要素が格納される方法のためだと思います。
List
は、元のオブジェクトへの参照のコレクションにすぎません。 1000個の整数を作成した後、1000個の整数オブジェクトが作成され、list
にはこれらのオブジェクトへの参照しか含まれていないとします。
一方、set
またはdictionary
は、これら1000個の整数のハッシュ値を計算しなければならず、メモリは要素数に従って消費されます。
例:set
とdict
の両方で、最小サイズは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
は正しいです。ここでそれを使うことには何も問題ありません。 list
、set
またはdict
についてのより詳細な参考
はthis chapter
を参照してください。