1

要素のリストを処理したいのですがls、各要素は辞書に対応する要素を持っている場合と持っていない場合がありますd。私はそれを行うための2つの方法を考えることができます。ここに、sのキーであるすべての要素のセットがありますd。構築するときも構築dするのは簡単なsので、与えられたとおりにそれを取ります。

for e in ls:
    if e in s:
        process(d[e])

for e in ls:
    try:
        process(d[e])
    except KeyError:
        pass

2つのうち、どちらが速いですか?さらに、Pythonは「許可ではなく許しを求める」という原則を使用していると聞きました。これは、一般に、ステートメントを使用したテストifは例外を使用した場合よりも遅くなることを意味しますか?

4

1 に答える 1

4

順序が重要でない場合は、交差点を使用します。

for e in s.intersection(ls):
    # only elements that are in `s` *and* `ls` are iterated over
    process(d[e])

いずれにせよ、ほとんどの時間はおそらく費やされることになるprocess()ので、マイクロ最適化しないでください。代わりに、(理由の範囲内で)読みやすさを最適化します。

inテストと例外処理の選択について:ミスの数が少ない場合(比較的少数の例外)は例外処理が高速になりますが、ミスが多い場合は、大量inの例外を処理するよりもテストが高速になります。本当に気になる場合は、 timeitモジュールを使用してバランスを見つけてください。Programmers.SEの主題に関する私の答えを参照してください。

于 2012-12-22T22:02:14.517 に答える