予期せぬPythonの辞書の挙動

Harshal Parekhの:

私は、コードのこの部分を持っています:

import time

d = dict()
for i in range(200000):
    d[i] = "DUMMY"

start_time = time.time()

for i in range(200000):
    for key in d:
        if len(d) > 1 or -1 not in d:
            break
    del d[i]

print("--- {} seconds ---".format(time.time() - start_time))

なぜ、このテイク〜15秒に実行するのでしょうか?

私はコメントアウトした場合でも、del d[i]または内部ループ、それは〜0.1秒で実行されます。

Blckknght:

あなたが持っている問題は、一つでも要素(例えば反復処理によって引き起こされるnext(iter(d))大かつて辞書のを)が、多くのことを縮小してきました。あなたのハッシュ値を持つ不運得る場合、これはほぼ遅い辞書項目のすべてを反復処理などすることができます。そして、このコードは非常に(、予想通りので、Pythonのハッシュ設計による)「不運」です。

問題の理由は、あなたがアイテムを削除すると、Pythonは辞書のハッシュテーブルを再構築しないということです。使用辞書のハッシュテーブルは200000のその中の項目が、どれを持っているので(それはおそらくそのピーク時に完全に満杯ではなかったことから、おそらくより)今だけ1左はまだそれにより200000個のスペースを持っています。

あなたは辞書を反復処理しているとき、それはそれで、そのすべての値を持つ場合、最初のものを見つけるのは非常に単純です。最初のものは、最初のいくつかのテーブルエントリの1つになります。あなたがテーブルを空としてではなく、より多くの空白スペースは、テーブルの開始とまだ長いと時間がかかりますが存在する最初の値の検索になります。

これはさらに悪化します(自分自身だけに(主に)ハッシュ整数キーを使用していることを考えるかもしれない-1何か他のものにハッシュ)。「フル」の辞書の最初のキーは通常になると、この手段0、次の1ように、と。あなたが昇順に値を削除すると、あなたは非常に正確に最初のテーブルで最も古いキーを削除し、その検索が最大限に悪化させるだろう。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=8219&siteId=1