Pythonで新しい空のリストを作成する最良の方法は何ですか?
l = []
または
l = list()
私はこれを2つの理由で尋ねています:
- どちらが速いかに関する技術的な理由。(クラスを作成するとオーバーヘッドが発生しますか?)
- コードの可読性-どちらが標準的な慣習です。
Pythonで新しい空のリストを作成する最良の方法は何ですか?
l = []
または
l = list()
私はこれを2つの理由で尋ねています:
回答:
以下は、どのコードがより高速であるかをテストする方法です。
% 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()
ので好みます。
list('')
与える[]
の['']
ですか?
list('abcd')
してみて、すべてを理解してください)
list()
本質的には遅いです[]
。
シンボル検索があります(リストを別のものに再定義しなかった場合、Pythonが事前に知る方法はありません!)、
関数呼び出しがあり、
次に、反復可能な引数が渡されたかどうかを確認する必要があります(そのため、要素を含むリストを作成できます)ps。私たちの場合は何もありませんが、「if」チェックがあります
ただし、ほとんどの場合、速度の違いは実用的な違いにはなりません。
list()
がより遅い理由を理解するのは良いこと[]
です。
list()
、すべての任意の引数があった場合だけ発生しません「の要素を持つリストを作成する」それだけ...「反復可能であればチェック」をチェックしています。引数がある場合にのみ適用されます。のCコードが[]
と同じCコードを呼び出すことも可能ですlist()
。いずれにせよ、(c)にかかる時間は(a)+(b)に比べてごくわずかです。
使用します[]
。
私はそれについては本当に知りませんが、経験上、jpcgtが実際に正しいように思えます。次の例:次のコードを使用する場合
t = [] # implicit instantiation
t = t.append(1)
インタプリタでtを呼び出すと、リストなしで "t"だけが返され、他に何かを追加すると、たとえば
t = t.append(2)
「「NoneType」オブジェクトには属性「追加」がありません」というエラーが表示されます。しかし、私がリストを作成した場合
t = list() # explicit instantiation
その後、正常に動作します。
t.append(1)
変更が適切t
に行われ、何も返されないため、None
これNone
をに割り当てているためt
です。だからt
今でNone
はリストの代わりに参照します。ここでのあなたの間違いはt=t.append(1)
、単にの代わりに書くことでしたt.append(1)
。でも同じ動作に気付くlist()
ので、ここで違いはありません。