[解決済み] Pythonジェネレータを使うのにふさわしくないのはいつですか?
質問
これは、むしろ
Pythonのジェネレータ関数は何のために使うことができますか?
: Python ジェネレータ、ジェネレータ式、そして
itertools
モジュールは、最近のPythonのお気に入りの機能の一部です。特に、大量のデータに対して実行する一連の操作を設定するときに便利で、私はDSVファイルを処理するときによく使用します。
では、いつ
ではない
を使うのは良いタイミングなのでしょうか?
itertools
関数を使うか?
-
どのような場合に
zip()
よりもitertools.izip()
または -
range()
以上xrange()
または -
[x for x in foo]
以上(x for x in foo)
?
もちろん、最終的にはジェネレーターを実際のデータに解決する必要があります。通常はリストを作成するか、ジェネレーター以外のループで反復処理します。時には、長さを知る必要がある場合もあります。これは私が尋ねていることではありません。
ジェネレータを使うのは、中間データ用に新しいリストをメモリに割り当てないようにするためです。これは特に大きなデータセットに対して意味があります。小規模なデータセットでも意味があるのでしょうか。メモリと CPU のトレードオフは顕著ですか?
の目を見張るような議論に照らして、誰かがこれに関していくつかのプロファイリングを行ったなら、私は特に興味を持ちました。 リスト内包のパフォーマンス vs. map() および filter() . ( altリンク )
どのように解決するのですか?
ジェネレータの代わりにリストを使用する場合。
1) データにアクセスする必要がある 複数 回アクセスする必要がある (つまり、再計算する代わりに結果をキャッシュする)。
for i in outer: # used once, okay to be a generator or return a list
for j in inner: # used multiple times, reusing a list is better
...
2) 必要なのは ランダムアクセス (または前方順序以外のアクセス) が必要です。
for i in reversed(data): ... # generators aren't reversible
s[i], s[j] = s[j], s[i] # generators aren't indexable
3) あなたは 参加する 文字列を結合する必要があります (これはデータに対して 2 回のパスを必要とします)。
s = ''.join(data) # lists are faster than generators in this use case
4) あなたは PyPy を使っていて、通常の関数呼び出しやリスト操作と同じようにジェネレータコードを最適化できないことがある。
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Pythonプログラムの実行時間を取得するにはどうしたらいいですか?
-
[解決済み] virtualenvで異なるバージョンのPythonを使用する
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] Pythonの文字列書式をリストで使う
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ジェネレータ式とリスト内包の比較
-
[解決済み】ジェネレーター関数は何に使えるの?
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Python 言語を決定するには?