58

学期ごとに少なくとも 1 人の Python の学生がいてdict.update()、単一のキーと値のペアを追加するために使用しています。

mydict.update({'newkey':'newvalue'})

それ以外の

mydict['newkey'] = 'newvalue'

私はこの方法を教えていませんし、彼らがこの例をどこで見つけているのかもわかりませんが、効率が悪い (おそらく新しい 2 要素の dict を作成する) ことと、非標準であるため、実行しないように伝えています。

正直なところ、この構文ではなく、目に見えるメソッドを使用したいという欲求は理解できます。おそらく、他のメソッド呼び出しとの一貫性が高いと感じます。しかし、それは初心者のアプローチのように見えると思います。

この点について誰かが提供しなければならない知恵はありますか?

4

3 に答える 3

48

ベンチマークは、パフォーマンスへの影響に関するあなたの疑いが正しいように見えることを示しています。

$ python -m timeit -s 'd = {"key": "value"}' 'd["key"] = "value"'
10000000 loops, best of 3: 0.0741 usec per loop
$ python -m timeit -s 'd = {"key": "value"}' 'd.update(key="value")'
1000000 loops, best of 3: 0.294 usec per loop
$ python -m timeit -s 'd = {"key": "value"}' 'd.update({"key": "value"})'
1000000 loops, best of 3: 0.461 usec per loop

つまり、私のマシンでは約 6 倍遅くなります。ただし、Python は、最高のパフォーマンスが必要な場合に使用する言語ではないため、その状況で最も読みやすいものを使用することをお勧めします。多くの場合、それが[]方法ですupdateが、次のような状況ではより読みやすくなる可能性があります。

configuration.update(
    timeout=60,
    host='example.com',
)

...またはそのようなもの。

于 2013-03-17T00:09:35.437 に答える
10

キーを直接更新すると 3 倍速くなりますが、YMMV:

$ python -m timeit 'd={"k":1}; d.update({"k":2})'
1000000 loops, best of 3: 0.669 usec per loop

$ python -m timeit 'd={"k":1}; d["k"] = 2'
1000000 loops, best of 3: 0.212 usec per loop
于 2013-03-17T00:06:01.107 に答える
4

[]= は、オブジェクト指向言語やその他の言語では有効な構文要素ではないと感じる人がいます。私が APL 言語開発に携わっていた数十年前に、この議論を聞いたことを覚えています。その構文は Fortran からの継承です...

私は個人的にそのビューを購読していませんが、インデックス付きの割り当てに非常に満足しています。しかし、実際のメソッド呼び出しの方が優れていると主張する人もいます。そしてもちろん、複数のソリューションがあることは常に良いことです。

編集:ここでの本当の問題は、パフォーマンスではなく読みやすさです。理論的に正しくなくても、多くの人が割り当てを読みやすいと感じているため、インデックス付きの割り当ては耐えてきました。

于 2013-03-17T00:08:27.570 に答える