0

関数内のPythonで大きなアイテムを削除したい. 一部のフォーラムでは、del LargeObjectおよびその他のLargeObject= Noneを使用することを提案しています。パフォーマンス (アイテムを削除した後の速度とメモリの再利用) に関して、最適なソリューションはどれですか?

4

3 に答える 3

2

メモリの再利用に関しては、違いはありません。両方の状況でオブジェクトの refcount が 0 になったと仮定すると、メモリはまったく同じ方法で再利用されます。

于 2013-02-15T14:55:31.177 に答える
1

2 つのステートメントの違いは、ローカル名前空間からdel削除されることです (使用しようとすると、結果として a が発生します)。もう 1 つは現在の名前空間に a を保持しますが、その値は-- ほとんどの場合、使用しようとするとorになります。それ以外の場合、2 つのアプローチに大きな違いはありません。いずれにせよ、記憶を取り戻したい場合は、他に座っていることに言及していないことを確認する必要があります。LargeObjectNameErrorLargeObjectNoneValueErrorTypeErrorLargeObject

于 2013-02-15T14:55:31.733 に答える
1

del LargeObject電話の方が早いと思います。1 つの命令のみにコンパイルされます。

>>> import dis
>>> def fdel(foo):
...     del foo
... 
>>> def freassign(foo):
...     foo = None
... 
>>> dis.dis(fdel)
  2           0 DELETE_FAST              0 (foo)
              3 LOAD_CONST               0 (None)
              6 RETURN_VALUE        
>>> dis.dis(freassign)
  2           0 LOAD_CONST               0 (None)
              3 STORE_FAST               0 (foo)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE        

どちらの場合も、ラージ オブジェクトの参照カウントは 1 減り、0 に達するとメモリから削除されます。

ただし、速度の違いはごくわずかです。

>>> import timeit
>>> timeit.timeit('f("")', 'from __main__ import fdel as f')
0.16321110725402832
>>> timeit.timeit('f("")', 'from __main__ import freassign as f')
0.1656031608581543

これは心配する必要はありません。

于 2013-02-15T14:56:28.177 に答える