辞書のセットメソッドが完全にサポートされていれば(Python 3.9で得られる不気味な混乱ではなく)、キーのセットを単に「削除」できると便利です。ただし、そうでない場合、および削除する可能性のある多数のキーが含まれる可能性のある大きな辞書がある場合は、パフォーマンスについて知りたい場合があります。そこで、意味のある比較に十分な大きさを作成するコードを作成しました。100,000x 1000のマトリックスなので、合計で10,000,00アイテムです。
from itertools import product
from time import perf_counter
# make a complete worksheet 100000 * 1000
start = perf_counter()
prod = product(range(1, 100000), range(1, 1000))
cells = {(x,y):x for x,y in prod}
print(len(cells))
print(f"Create time {perf_counter()-start:.2f}s")
clock = perf_counter()
# remove everything above row 50,000
keys = product(range(50000, 100000), range(1, 100))
# for x,y in keys:
# del cells[x, y]
for n in map(cells.pop, keys):
pass
print(len(cells))
stop = perf_counter()
print(f"Removal time {stop-clock:.2f}s")
設定によっては1000万個以上のアイテムも珍しくありません。ローカルマシンで2つの方法を比較するmap
とpop
、おそらく関数呼び出しが少ないため、およびを使用すると若干の改善が見られますが、私のマシンではどちらも約2.5秒かかります。しかし、これは、最初に辞書を作成するのに必要な時間(55秒)に比べて、またはループ内にチェックを含めるのに比べると見劣りします。これが可能性が高い場合は、辞書のキーとフィルターの共通部分であるセットを作成するのが最善です。
keys = cells.keys() & keys
要約すると:del
はすでに非常に最適化されているため、使用する必要はありません。