web-dev-qa-db-ja.com

辞書をPython

Python辞書と連携して動作するプログラムがあります。辞書のコピーを何千回も作成する必要があります。キーと関連コンテンツの両方のコピーが必要です。コピーは編集されますオリジナルにリンクしてはいけません(たとえば、コピーの変更はオリジナルに影響してはいけません)。

キーは文字列、値は整数(0/1)です。

私は現在、簡単な方法を使用します:

_newDict = oldDict.copy()
_

コードをプロファイリングすると、コピー操作にほとんどの時間がかかることがわかります。

dict.copy()メソッドのより高速な代替手段はありますか?最速は何ですか?

88
Joern

Cソース を見て、Python dict操作については、これは基本的に_PyDict_Merge_の呼び出しに要約されます。

_PyDict_Merge(PyObject *a, PyObject *b, int override)
_

これは、それらが同じオブジェクトであるか、それらにオブジェクトがあるかなどの簡単なチェックを行います。その後、ターゲットの辞書に寛大な1回のサイズ変更/割り当てを行い、要素を1つずつコピーします。組み込みのcopy()よりもずっと速くなるとは思わない。

62
Daniel DiPaolo

あなたが言うように、どうやらdict.copyは高速です。

[utdmr@utdmr-Arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = d.copy()"
1000000 loops, best of 3: 0.238 usec per loop
[utdmr@utdmr-Arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = dict(d)"
1000000 loops, best of 3: 0.621 usec per loop
[utdmr@utdmr-Arch ~]$ python -m timeit -s "from copy import copy; d={1:1, 2:2, 3:3}" "new = copy(d)"
1000000 loops, best of 3: 1.58 usec per loop
54
utdemir

Copy()の使用方法とコンテキストを確認できるように、コードサンプルを提供できますか?

使用できます

new = dict(old)

しかし、私はそれが速くなるとは思わない。

12
MikeVaughan

推測に任せるものによっては、元の辞書をラップしてsort of copy-on-writeを実行することもできます。

「コピー」は、キーがまだ含まれていない場合に「親」ディクショナリ内の内容を検索する辞書です。ただし、それ自体に変更を加えます。

これは、元のファイルを変更せず、追加のルックアップのコストが高くならないことを前提としています。

3
Alex Brasetvik

これは古いスレッドであることがわかりますが、これは「dict copy python」の検索エンジンでは高い結果であり、「dict copy performance」の最高の結果であり、これは関連があると思います。

からPython 3.7、newDict = oldDict.copy()は以前よりも最大5.5倍高速になりました。特に、現時点では、newDict = dict(oldDict)にはこのパフォーマンスがないようです。増加する。

もう少し情報があります こちら

3
iandioch

ただし、測定値は辞書のサイズに依存します。 10000エントリの場合、copy(d)とd.copy()はほぼ同じです。

a = {b: b for b in range(10000)} 
In [5]: %timeit copy(a)
10000 loops, best of 3: 186 µs per loop
In [6]: %timeit deepcopy(a)
100 loops, best of 3: 14.1 ms per loop
In [7]: %timeit a.copy()
1000 loops, best of 3: 180 µs per loop