4

私のマシンでは、d.clear()との間の実行速度d={}は 100ns を超えているので、なぜ一方を他方に使用するのか興味があります。

import timeit

def timing():
    d = dict()

if __name__=='__main__':
    t = timeit.Timer('timing()', 'from __main__ import timing')
    print t.repeat()
4

2 に答える 2

19

違いはd = {}、新しい辞書を作成し、既存d.clear()の辞書を空にすることです。ディクショナリへの参照を保持するコード内の他の場所がある場合、この微妙な違いが重要になります。最初のケースでは、元の辞書を変更していないため、他のオブジェクトは変更されません。次のコードは、この動作の違いを示しています。

新しい辞書の作成:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d = {}
>>> d2
{'foo': 'bar'}

既存の辞書をクリアする:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}
于 2010-04-28T19:33:39.617 に答える
6

d={}新しい辞書を作成します。

d.clear()辞書をクリアします。

を使用するd={}と、 を指すものはすべてd古い を指すことになりますd。これにより、バグが発生する可能性があります。

を使用するd.clear()と、 を指すものはすべてd、クリアされた辞書を指すようになります。これが意図したものでない場合は、バグが発生する可能性もあります。

d.clear()また、 (CPython では) が占有するメモリを解放するとは思いませんd。パフォーマンスのために、CPythonは、要素を削除するときに辞書からメモリを奪いません。辞書の通常の使用法は、大きな辞書を構築し、いくつの要素を削除することです。メモリの再割り当て (およびハッシュ テーブルの一貫性を確保すること) は、ほとんどのユース ケースで時間がかかりすぎます。turds代わりに、要素が以前はそこにあったが削除されたことを示す (メーリング リストの専門用語) で辞書を埋めます。ただし、これが行われるかどうかは完全にはわかりませんd.clear()が、すべてのキーを 1 つずつ削除すると確実に行われます。

于 2010-04-29T02:46:17.747 に答える