1. ホーム
  2. python

[解決済み] 2つの同じリストが異なるメモリフットプリントを持つのはなぜですか?

2022-04-25 13:25:04

質問

私は2つのリストを作成しました l1l2 が、それぞれ異なる作成方法で作成されています。

import sys

l1 = [None] * 10
l2 = [None for _ in range(10)]

print('Size of l1 =', sys.getsizeof(l1))
print('Size of l2 =', sys.getsizeof(l2))

しかし、その出力には驚かされた。

Size of l1 = 144
Size of l2 = 192

リスト内包で作成したリストの方がメモリ上のサイズは大きくなりますが、それ以外のPythonでは2つのリストは同じです。

それはなぜでしょうか?これはCPythonの内部的なものなのでしょうか、それとも他の説明なのでしょうか?

解決方法は?

と書くと [None] * 10 Pythonはちょうど10個のオブジェクトのリストが必要であることを知っているので、まさにそのリストを割り当てます。

リスト内包を使う場合、Pythonはどれくらいの量が必要になるのかわかりません。そのため、要素が追加されるたびに徐々にリストを大きくしていきます。再割り当てのたびに、すぐに必要な量よりも多くの領域を割り当て、各要素のために再割り当てする必要がないようにします。その結果、リストは必要以上に大きくなる可能性があります。

この動作は、同じようなサイズで作成されたリストを比較するとわかります。

>>> sys.getsizeof([None]*15)
184
>>> sys.getsizeof([None]*16)
192
>>> sys.getsizeof([None for _ in range(15)])
192
>>> sys.getsizeof([None for _ in range(16)])
192
>>> sys.getsizeof([None for _ in range(17)])
264

最初の方法は必要なものだけを確保し、2番目の方法は定期的に増やしていくことがわかります。この例では、16個分の要素を確保し、17個目になると再割り当てする必要がありました。