私のマシンでは、d.clear()
との間の実行速度d={}
は 100ns を超えているので、なぜ一方を他方に使用するのか興味があります。
import timeit
def timing():
d = dict()
if __name__=='__main__':
t = timeit.Timer('timing()', 'from __main__ import timing')
print t.repeat()
違いはd = {}
、新しい辞書を作成し、既存d.clear()
の辞書を空にすることです。ディクショナリへの参照を保持するコード内の他の場所がある場合、この微妙な違いが重要になります。最初のケースでは、元の辞書を変更していないため、他のオブジェクトは変更されません。次のコードは、この動作の違いを示しています。
新しい辞書の作成:
>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d = {}
>>> d2
{'foo': 'bar'}
既存の辞書をクリアする:
>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}
d={}
新しい辞書を作成します。
d.clear()
辞書をクリアします。
を使用するd={}
と、 を指すものはすべてd
古い を指すことになりますd
。これにより、バグが発生する可能性があります。
を使用するd.clear()
と、 を指すものはすべてd
、クリアされた辞書を指すようになります。これが意図したものでない場合は、バグが発生する可能性もあります。
d.clear()
また、 (CPython では) が占有するメモリを解放するとは思いませんd
。パフォーマンスのために、CPythonは、要素を削除するときに辞書からメモリを奪いません。辞書の通常の使用法は、大きな辞書を構築し、いくつかの要素を削除することです。メモリの再割り当て (およびハッシュ テーブルの一貫性を確保すること) は、ほとんどのユース ケースで時間がかかりすぎます。turds
代わりに、要素が以前はそこにあったが削除されたことを示す (メーリング リストの専門用語) で辞書を埋めます。ただし、これが行われるかどうかは完全にはわかりませんd.clear()
が、すべてのキーを 1 つずつ削除すると確実に行われます。