私は時折大きな辞書やリストを作成する長いスクリプトを書いていますが、それらをdel
使い終わったらそれらを削除することでパフォーマンスが向上するかどうか疑問に思っていました. それとも、これらのオブジェクトをぶら下げたままにして、ガベージコレクションで処理するのが通常の慣行ですか? ここでのベストプラクティスは何ですか? ありがとう。
3 に答える
del
free(3) と同等ではありません。Python にメモリの解放を強制するものではありません。メモリがまったく解放されない場合があります。それをメモリ使用量に完全に関連付けることは避けてください。
唯一のことdel
は、そのスコープから名前を削除することです。(または、コレクションからアイテムを削除するか、属性を削除します。しかし、それはあなたがここで話していることではないと思います。)
事実上、これは:
del foo
これと同等です:
del LOCAL_SCOPE['foo']
したがって、これはメモリを解放しません。
massive_list = list(range(1000000))
same_massive_list = massive_list
del massive_list
...名前 を削除するだけなのでmassive_list
。基になるオブジェクトにはまだ別の名前がsame_massive_list
あるため、消えません。 del
Python のメモリ管理を制御するための秘密のフックではありません。これは、 Python にメモリ管理を呼び出すいくつかの方法の 1 つにすぎません。
(ちなみに、CPython は refcounted + cycle-collected であり、ガベージ コレクションではありません。オブジェクトへの最後の参照が消えるとすぐに、オブジェクトはすぐに解放されます。ガベージはクリーンアップされるのを待って周りに横たわることはありません。もちろん、他の実装では異なります。たとえば、PyPy はガベージ コレクションです。)
ここで、使用する名前がリスト/辞書/その他の唯一del
の名前である場合、その参照カウントが確実にゼロになるため、解放されます。 しかし、のセマンティクスは実際には名前del
の削除に関するものであるため、この場合は使用しません。変数をスコープから除外するか (実用的であれば)、名前を空のリストに再割り当てするか、またはプログラムにとって意味のあるものにします。リストをその場で空にすることもできます。これは、同じリストに複数の名前がある場合でも機能します。None
foo = list(range(1000000))
bar = foo
foo[:] = []
# Both `bar` and `foo` still refer to the original list, but now it's empty
を使用して、dict に対して同じことを行うことができますd.clear()
。
名前で使用する唯一の場所del
は、一時的にヘルパー値が必要なクラスまたはモジュールのスコープ内ですが、実際には API の一部として公開したくありません。これは非常にまれですが、「この名前を削除する」というセマンティクスが実際に必要な場合に遭遇したのはこれだけです。
del
通常は必要ありません。
CPython では、オブジェクトへの参照がない場合、オブジェクトは消えます。del
オブジェクトへの参照を 1 つだけ削除します。オブジェクトへの他の参照がまだある場合、それは残りdel
、メモリ状況を改善するために実際には何もしていません。
逆に、単純に変数を別のオブジェクトに再割り当てする (たとえば、ループの先頭に新しい空のリストを作成する) と、オブジェクトへの参照が 1 つ少なくなり、暗黙的に と同じことが行われdel
ます。この時点でオブジェクトへの他の参照がない場合、オブジェクトはすぐに解放されます。
また、関数が戻るとローカル変数はなくなるのでdel
、関数で定義した名前を明示的に指定する必要がないことも覚えておいてください。
例外は循環参照です。この場合、2 つ (またはそれ以上) のオブジェクトが相互に参照しますが、実際には名前から到達できるものはありません。Python は定期的にこれらをガベージ コレクションしますが、オブジェクトの処理が完了したときに円を壊すと、より速く解放できます。(これには 1 つしか必要ない場合がありますdel
!) ただし、これが役立つ状況はおそらく非常にまれです。
IronPyothon (.NET CLR で実行) または Jython (JVM で実行) では、基盤となる VM のガベージ コレクターが使用されるため、最適なメモリ管理戦略が異なる場合があります。
Pythonの利点の1つ(Cなどの言語と比較して)は、一般に、メモリ管理の詳細について心配する必要がなく、プログラムの目的に集中できることです。
ですから、私のアドバイスは、あなたがそうする理由がない限り、気にしないことです(例えば、PythonはあなたのRAMをすべて使い果たしています)。