sys.getsizeof()を使用してリストと辞書のサイズをチェックすると、何か面白いことが起こることに気付きました。
私は持っています:
a = [1,2,3,4,5]
サイズは56バイトです(空のリストのサイズは36なので、20/5 = 4なので意味があります)
ただし、リスト内のすべてのアイテムを削除した後(.removeまたはdelを使用)、サイズは56のままです。これは私には奇妙です。サイズを36に戻すべきではありませんか?
説明はありますか?
sys.getsizeof()を使用してリストと辞書のサイズをチェックすると、何か面白いことが起こることに気付きました。
私は持っています:
a = [1,2,3,4,5]
サイズは56バイトです(空のリストのサイズは36なので、20/5 = 4なので意味があります)
ただし、リスト内のすべてのアイテムを削除した後(.removeまたはdelを使用)、サイズは56のままです。これは私には奇妙です。サイズを36に戻すべきではありませんか?
説明はありますか?
このリストは、要素を削除したときにメモリを解放することを約束するものではありません。リストは過剰に割り当てられています。これにより、要素を追加するためのO(1)パフォーマンスを償却することができます。
データ構造の時間パフォーマンスの詳細:http ://wiki.python.org/moin/TimeComplexity
コンテナのサイズを大きくすると、メモリ内で多くのものを移動する必要があるため、コストのかかる操作になる可能性があります。そのため、Pythonはほとんどの場合、リストの現在のコンテンツに必要な量よりも多くのメモリを割り当てます。これにより、リストへの個々の追加は、メモリを移動することなく実行される可能性が非常に高くなります。同様の理由で、リストは削除された要素のメモリをすぐに、またはこれまでに解放しない場合があります。
ただし、スライス割り当てを使用してすべての要素を一度に削除する場合は、次のようになります。
a[:] = []
それはそれをリセットするようです。ただし、これは実装の詳細です。
Pythonリストにアイテムを追加すると、リストにすでに割り当てられているメモリがいっぱいの場合、指定された量のメモリが割り当てられます。リストからアイテムを削除すると、次にアイテムをリストに追加するときに割り当てられたメモリが保持されます。例については、この関連記事を参照してください。