巨大な文字列からアルファベットを抽出する問題を考えてみましょう。リスト内包は、文字のリストを生成します。実行する弦に結合する。ジェネレータまたはリストの理解?
一つの方法は、メカニズムは明らかである
''.join([c for c in hugestring if c.isalpha()])
です。結合メソッドは、リストの長さにアクセスして結合する必要のある文字の数を認識します。行うには
他の方法は、ここで
''.join(c for c in hugestring if c.isalpha())
発電機で発電理解した結果です。結合メソッドは、生成元がlen属性を持たないため、結合する文字数を認識しません。したがって、この結合方法はリストの理解方法よりも遅くなるはずです。
しかし、Pythonでテストすると、遅くはないことがわかります。なぜこれはそうですか? ジェネレータで結合がどのように機能するかは誰でも説明できます。
は明確であるために:それは累積合計を追跡することができますので、
sum(j for j in range(100))
は、100のいずれかの知識を持っている必要はありません。ジェネレータの次のメソッドを使用して次の要素にアクセスし、累積合計に加算することができます。 しかし、文字列は不変であるため、文字列を結合すると、各繰り返しで新しい文字列が作成されます。だからこれには多くの時間がかかります。
したがって、スピード違反通知の違いはまさに情緒的なものでなければなりません。 –
@ Ev.Kounis:質問者は、2つのバージョンが同じスピード(「**遅くない」)であると言いました。これは、「参加」の時間とリストの理解の時間の両方を測定していれば意味があります一緒に。 'join 'だけを測定した場合、ジェネレータ表現バージョンは、ジェネレータ表現のバージョンが遅くなります。なぜなら、結合する文字列を実行する前にジェネレータ全体をリストにダンプする必要があるからです。それは、リストの理解を構築するのと同じくらい多くの時間がかかるでしょう。 – Blckknght