7

del d[key]キーと値のペアが削除されることを理解していますがd[key]=None、値の参照を解除するだけです。

しかし、メモリ管理に関して、何か違いはありますか?Noneこの値を参照する他の変数がないと仮定して、値を設定するとすぐにガベージコレクションがトリガーされますか?

私は少し実験を行いました:

In [74]: import sys
In [75]: a = {'a': 'blah'}

In [76]: sys.getsizeof(a)
Out[76]: 280

In [77]: a['a'] = None

In [79]: sys.getsizeof(a)
Out[79]: 280

In [80]: del a['a']

In [81]: sys.getsizeof(a)
Out[81]: 280

アプローチが有効かどうかはわかりませんが、辞書のサイズに関してはまったく違いがないようです。私はここで何かを逃さなければなりません。

4

3 に答える 3

9

sys.getsizeofdict自体のサイズを測定します。含まれる値のサイズではありません。

Noneオブジェクトです。ある程度のメモリが必要です。

含まれている値のサイズを含むdictのサイズを見つけるには、 pymplerを使用できます。

In [26]: import pympler.asizeof as asizeof

In [27]: asizeof.asizeof({'a': None})
Out[27]: 168

In [28]: asizeof.asizeof({})
Out[28]: 136

In [29]: import sys

In [30]: 
In [31]: sys.getsizeof({})
Out[31]: 136

In [34]: sys.getsizeof({'a':None})
Out[34]: 136
于 2012-11-10T14:55:55.677 に答える
2

unutbuは正しいです。ただし、Pythonのガベージコレクターの取り込みが少し遅くなることもあります。

オブジェクトに対してdelを呼び出し、そのオブジェクトへのすべての参照を削除するということは、ガベージコレクターが準備ができたと感じたときにいつでもそれを収集できることを意味します。これにより、通常、使用されるメモリの量がすぐに減少することはありません。

gcモジュールを使用して、コレクションを強制し、ガベージコレクターが実際に何を認識しているかを確認できます。

于 2012-11-10T15:02:02.130 に答える
0

Pythonディクショナリには、ロジックの横に、すべてのキーへのポインターとすべての値へのポインターが含まれています。

  • 値をNoneに設定すると、ディクショナリ内のオブジェクトの数がそのまま残り、1つの値ポインタがNoneオブジェクトへのポインタに置き換えられます。古い値オブジェクトが他の場所から参照されなくなった場合、ガベージコレクションされます。キーは残ります。
  • キーや値が参照されなくなったことを意味する場合、値を削除すると、両方がクリーンアップされ、原則としてディクショナリ自体のサイズが小さくなります。辞書が実際に「縮小」するかどうかは、実装の詳細はわかりません。

1つのオブジェクトでこれをテストすることは、代表的なものではない場合があります。百万を試してみてください。さらに、短い「文字列」オブジェクトでテストすることは、文字列が「インターン」される可能性があるため、代表的ではない可能性があります。つまり、インタプリタが再度必要とするときに自動的に再利用される破壊不可能なオブジェクトのセットの一部になる可能性があります。

于 2012-11-10T15:51:57.037 に答える