2012-03-26 10 views
3

「From」や「To」のように、繰り返し処理が必要なコンポーネントがあります。便宜上、これらの文字列を繰り返し処理することができますが、これを一度だけ行う必要があるため、長期間保存する必要はありません。このインスタンスでリストまたはタプルを使用する方がよいでしょうか?オンザフライキー繰り返しのためのpythonリストとタプル

info = {} 
for type in ('from', 'to'): 
    info[type] = fetch(type); 

タプルがリストに変更された場合、上記はまったく同じになります。私はいくつかの好みがあるのだろうかと思っています。

+1

これは参考になるかもしれません:http://stackoverflow.com/questions/68630/are-tuples-more-efficient-than-lists-in-python – Hamish

答えて

7

変更を加えない場合は、タプルがうまく適用されると思います。私はコレクションに追加、減算などの動的な操作を行う必要があるときにのみリストを使用します。

さらに、タプルにアクセスするのがより高速です。それは決める前にあなたの特定のユースケースを常にテストすべきだと言われています。

7

タプルは、不変である可能性が最も高いです。分解も少なくオペコードをタプルで使用されていることを示しています

2   0 SETUP_LOOP    20 (to 23) 
       3 LOAD_CONST    1 ('a') 
       6 LOAD_CONST    2 ('b') 
       9 BUILD_LIST    2 
      12 GET_ITER 

2   0 SETUP_LOOP    14 (to 17) 
       3 LOAD_CONST    3 (('a', 'b')) 
       6 GET_ITER 

それは本当に、パフォーマンスの問題のそのビットならば、あなたがCまたはアセンブリコードを書く必要があります、しかし重要ではありません。代わりに。

1

タプルは明らかにメモリーが小さく、作成が速いですが、1または2の項目では、99.99%の状況でどのように重要か想像できません。

1

タプルは、おそらくこの場合はリストよりも優れているが、あなたはまた、

for item in a, b: 
    process(item) 

を行うことができます私は本当にこのケースで何が起こっているのか疑問に思って:P

編集:

:それはに変換しますタプルのようです
3 LOAD_CONST    3 (('a', 'b')) 

...

+0

これはタプルを作成しています。 –

+0

これは、質問が既に持っているタプルを表現するためにわずかに異なるsintaxです。 – vascop

+4

タプルは、多くの人が考えるように '()'によって作成されるのではなく '、'によって作成されますが、 '()'がなければ人を混乱させます。 – ThiefMaster

1

私はあなたのquestioを理解していればこの状況では、という慣用句が何であるかを尋ねています。あなたがこれを一度しかやっていないと言って以来、パフォーマンスとメモリ効率は事実上重要ではありません。

答えは、Pythonの存在の大部分では、人々は繰り返し処理するためにタローを使いますそれを変えるつもりがないときは不変のものを使う癖があるからです。

[編集:いくつかの無関係なセットを削除しました。私はあまりにも実際に貢献していないときにそれを答えにひねりたいと思っていました。]

時々ボーカル少数派がリストを主張することに注意してください。これの根拠は、リストはもともとPythonの「配列」型として考えられていましたが、タプルは「レコード型」型でした。つまり、リストは単一のタイプの複数のオブジェクト(テストスコアのコレクションなど)を保持するためのものですが、タプルは任意の関連オブジェクト(名前、住所、電話番号など)を保持するためのものでした。しかし、これを遵守することは古くから古風である。

+0

あなたは私の質問を完全に理解しています。なぜ*リテラル*構文をこのインスタンスのタプルより優先させるのでしょうか(それはあまりにも醜いと思います)。 –

+1

@ tandu:申し訳ありませんが、実際にはこのインスタンスにはありません。私は本当にそれはあまり意味がないし、一般的な練習でもないので、私は自分の答えからその材料を編集しました。 (人々が*セットリテラルを使うのが好きなのは、伝統的にタプルを使っていたのですが、少数の定数コレクションでメンバーシップをテストすることです)。 –

関連する問題