リストよりもPythonジェネレーターを優先する必要がありますか?


8

Pythonイテレータはメモリ効率が非常に高くなります。リストだけでなく、常にジェネレータを使用した方がよいですか?どのような場合に、単純な配列を使用すべきですか?

たとえば、これの代わりに:

emails = [user.email for user in users]

私はこれを好むべきですか?:

emails = (user.email for user in users)

:「イテレータ」ではなく「ジェネレータ」を意味します。


何が必要かわからない特定の問題を明確にするか、追加の詳細を提供して、必要なものを正確に強調してください。それは現在書かれているので、あなたが解決しようとしている問題、またはあなたのアプローチのどの側面を修正または説明する必要があるのか​​を見分けるのは難しいです。この質問の明確化については、「質問方法」ページをご覧ください。
gnat

@gnatは、「Pythonでイテレータまたはリストをいつ使用する必要がありますか?」と言い換えます。大丈夫?
Florian Margaine、2015

閉じているの危険にそれを置くでしょう@FlorianMargaine 広すぎる私は怖い
ブヨ

2
@FlorianMargaineそれは良いスタートですが、それはまだ弱い質問のようなものです。著者の研究はどこにありますか?確かに彼はいくつかの違いを考えることができます。どちらか一方を使用する可能性のあるすべての状況を列挙するように依頼することは、それほどすばらしいことではありません。
Doval 2015

2
+1少し不明確な質問かもしれませんが、これらの構造の使い方を学んでいるだけでは、質問は曖昧に形成され、表現されます。答えから多くを学びました。
ラチェット2015

回答:


7

ジェネレータの主な欠点は、一方向にしかトラバースできないことです。以前の値に戻ることはありません。それらを共有することもできません。それが簡単に説明できる場合もあれば、それが望ましい場合も多くありますが、そうでない場合も多くあります。たとえば、並べ替え。

そのため、大量のデータの初期処理段階でジェネレーターが使用され、サブセットにフィルター処理されて適切な形式にマップされると、永続的な具象データ構造に組み込まれることがよくあります。さらに使用。これにより、メモリの割り当て、キャッシュミス、ガベージコレクションのコストを、すぐに捨ててしまう大きな中間配列に費やすことがなくなります。


3

イテレータがジェネレータと混同されています。

最初の例はリスト反復子式で、2番目の例はジェネレータ式です。主な違いは、ジェネレーターは(必要に応じて)即座にではなく(必要に応じて)所定のコレクションの各メンバーを(必要に応じて)遅延して作成することです。returnではなくyieldを使用して、独自のジェネレーターを定義できます。

使用方法に関する限り、それ自体のためのリスト(または辞書など)が必要な場合は、イテレータが必要です。コレクションが最終製品に付随する場合は、ジェネレータを使用します。たとえば、ジェネレータを使用して、いくつかの他の基準からいくつかの基準を満たす数値のリストを取得できます。元のリストは気にせず、基準に一致するメンバーだけが対象です。したがって、ジェネレータを使用して、これらの数値のみを取得します。

より具体的な例は、辺の長さが一定である三角形の角度を見つけることです。私たちはすべての貧しい、変形した三角形が必要なのではなく、強くて健康な三角形だけが欲しいです。したがって、ジェネレータを使用します。

このスタックオーバーフローの投稿では、さらに詳しく説明しています。

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