Pythonで空のリストを作成する


243

Pythonで新しい空のリストを作成する最良の方法は何ですか?

l = [] 

または

l = list()

私はこれを2つの理由で尋ねています:

  1. どちらが速いかに関する技術的な理由。(クラスを作成するとオーバーヘッドが発生しますか?)
  2. コードの可読性-どちらが標準的な慣習です。

4
"もっと早く"?なぜtimeitを実行しなかったのですか?
S.Lott

回答:


335

以下は、どのコードがより高速であるかをテストする方法です。

% python -mtimeit  "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop

% python -mtimeit  "l=list()"
1000000 loops, best of 3: 0.297 usec per loop

ただし、実際には、この初期化はプログラムの非常に小さな部分である可能性が高いので、これを心配することはおそらく間違った方向に進んでいます。

読みやすさは非常に主観的です。私はを好みますが[]、アレックスマルテリのように知識のある人は発音できるlist()ので好みます。


12
うわー、プロファイリングをありがとう。私はいつもそれがどのように行われたのか知りたいと思っていました。
user225312

なぜ代わりにlist('')与える[]['']ですか?
Chris_Rands 2018

これは、このfunc makeリストが反復可能型であるため、複数の引数に挿入できなかったためです。(タイプlist('abcd')してみて、すべてを理解してください)
Ivan Lavrenov '17 / 10/17

133

list()本質的には遅いです[]

  1. シンボル検索があります(リストを別のものに再定義しなかった場合、Pythonが事前に知る方法はありません!)、

  2. 関数呼び出しがあり、

  3. 次に、反復可能な引数が渡されたかどうかを確認する必要があります(そのため、要素を含むリストを作成できます)ps。私たちの場合は何もありませんが、「if」チェックがあります

ただし、ほとんどの場合、速度の違いは実用的な違いにはなりません。


38
+1:list()がより遅い理由を理解するのは良いこと[]です。
エリックOレビゴット

2
以下の場合はlist()、すべての任意の引数があった場合だけ発生しません「の要素を持つリストを作成する」それだけ...「反復可能であればチェック」をチェックしています。引数がある場合にのみ適用されます。のCコードが[]と同じCコードを呼び出すことも可能ですlist()。いずれにせよ、(c)にかかる時間は(a)+(b)に比べてごくわずかです。
John Machin

1
@ジョン・マキン-混乱して申し訳ありませんが、私が(c)で意味したことは、引数があるかどうかを確認する必要があるということでした、はい。残りは議論があった場合に何が起こるかについてでした、私たちのケースではそれはありません
Nas Banov

16

使用します[]

  1. リスト表記は短絡なので、より高速です。
  2. アイテムを含むリスト作成すると、リスト作成しない場合とほぼ同じように見えるはずですが、なぜ違いがあるのですか?

3

私はそれについては本当に知りませんが、経験上、jpcgtが実際に正しいように思えます。次の例:次のコードを使用する場合

t = [] # implicit instantiation
t = t.append(1)

インタプリタでtを呼び出すと、リストなしで "t"だけが返され、他に何かを追加すると、たとえば

t = t.append(2)

「「NoneType」オブジェクトには属性「追加」がありません」というエラーが表示されます。しかし、私がリストを作成した場合

t = list() # explicit instantiation

その後、正常に動作します。


15
これは、t.append(1)変更が適切tに行われ、何も返されないため、NoneこれNoneをに割り当てているためtです。だからt今でNoneはリストの代わりに参照します。ここでのあなたの間違いはt=t.append(1)、単にの代わりに書くことでしたt.append(1)。でも同じ動作に気付くlist()ので、ここで違いはありません。
-Darkonaut

1

@Darkonautの回答を強調するためだけに表示します。

new_list = []またはnew_list = list()両方とも(パフォーマンスを無視して)正常ですが、をappend()返します。Noneその結果、を実行できませんnew_list = new_list.append(something

私はそのような返済型の決定に非常に困惑しています。ああ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.