web-dev-qa-db-ja.com

「d = dict()」と「d = {}」の違い

$ python2.7 -m timeit 'd={}'
10000000 loops, best of 3: 0.0331 usec per loop
$ python2.7 -m timeit 'd=dict()'
1000000 loops, best of 3: 0.19 usec per loop

なぜ一方を他方の上に使用するのですか?

35
tshepang

私は句読点よりも単語を好む人の1人です。たとえば、PerlよりもPythonを選んだ理由の1つです。 「中かっこがないと人生は良くなる」(笑顔のティーンエイジャーの漫画が入ったTシャツに付けられた古いPythonモットー;-)結局のところ(元々はグループ化のために中かっことインデントを指すことを意図していたもちろんですが、中かっこは中かっこです!-)。

数ナノ秒の「支払い」(中かっこ、括弧などの代わりに、明確で読みやすい短い単語を使用するため)は、一般的に手頃な価格です(ほとんどの場合、組み込みの名前空間を検索するコストであり、毎回支払う価格です。組み込みの型または関数を使用し、ループからいくつかのルックアップを持ち上げることで、それを穏やかに最適化することができます)。

ですから、私は一般的に、{}の代わりにdict()L[:]の代わりにlist(L)[]の代わりにlist()Tuple()を書くのが好きな人です。 ()など発音可能コードの一般的なスタイル設定。別のスタイルを使用する既存のコードベースで作業する場合、または新しいプロジェクトのチームメイトが他の方法で強い好みを持っている場合は、もちろんそれを受け入れることができます(ただし、チームメイトの場合は少し伝道を試みる必要があります)。 ;-)。

56
Alex Martelli

d=dict()ではルックアップが必要です locals() then globals() then __builtins__d={}しません

25
John La Rooy

人々が(ちょうど)dict()を(ちょうど)_{}_よりも使用する場合、それは一般に、_{}_(これはかなりの偉業です)について知らないか、それがより明確(主観的ですが、一般的ではありません)。

dictでできることは、_{}_ではできないこともあります。たとえば、collections.defaultdict(dict)のように、呼び出し可能を期待するものに渡すなどです。キーワード引数を使用してdictを呼び出すことができるという事実もあります。これは、一部の人々が好むものです。

_>>> dict(spam=1, ham=2)
{'ham': 2, 'spam': 1}
_

個人的には、有効な識別子ではないキーを使用する場合にうまく機能するため、dictリテラル構文を好みます。

_>>> dict(pass=1)
 File "<stdin>", line 1
    dict(pass=1)
        ^
SyntaxError: invalid syntax
>>> dict('ham and eggs'=1)
  File "<stdin>", line 1
SyntaxError: keyword can't be an expression
_

(そして、いくつかのキーが有効な識別子ではないという理由だけでスタイルを混合する、うん。)

9
Thomas Wouters

Doug Hellmannは、パフォーマンスの違いの徹底的な 比較 を書きました。

tl; dr

CPython 2.7では、dict()を使用して辞書を作成するのに最大6倍の時間がかかり、リテラル構文よりも多くのメモリ割り当て操作が必要になります。 {}を使用して辞書を作成します。特に、リテラル構文が機能しない場合を除いて、辞書に事前入力している場合はそうです。

7

Thomasが言ったように、私はdict()を使用して、キーワードを指定できます。特に、データの初期化などのために大きな辞書を手動で作成している場合は、キーワード構文を使用できるため、要素ごとに2つのキーストローク(および関連する視覚的な混乱)を節約できます。

1
Vicki Laidler