len(generator()) の使い方 [重複] 質問する

len(generator()) の使い方 [重複] 質問する

Python ジェネレータは非常に便利です。リストを返す関数よりも利点があります。ただし、 も可能ですlen(list_returning_function())。 方法はありますかlen(generator_function())?

アップデート:
もちろんlen(list(generator_function()))動作します.....
私は、作成中の新しいジェネレータ内で、作成したジェネレータを使用しようとしています。新しいジェネレータの計算の一部として、古いジェネレータの長さを知る必要があります。ただし、ジェネレータとして同じプロパティで両方を一緒に保持したいのですが、具体的には、メモリ内にリスト全体を保持しないようにします。とても長さ。

更新2:
発電機を想定知っている最初のステップからターゲットの長さです。また、len()構文を維持する理由はありません。例 - Python の関数がオブジェクトである場合、新しいジェネレーターがアクセスできるこのオブジェクトの変数に長さを割り当てることはできませんか?

ベストアンサー1

他の回答で提案されているへの変換は、list後でジェネレータ要素を処理したい場合に最適な方法ですが、1つの欠点があります。それは、O(n) メモリを使用することです。次のようにすると、それほど多くのメモリを使用せずにジェネレータ内の要素をカウントできます。

sum(1 for x in generator)

もちろん、これはlen(list(generator))一般的な Python 実装よりも遅くなる可能性があること、またジェネレータがメモリの複雑さが問題になるほど長い場合は、操作にかなりの時間がかかることに注意してください。それでも、個人的にはこのソリューションの方が、取得したいものを説明し、必要のない余分なもの (すべての要素のリストなど) を提供しないため、気に入っています。

また、delnan のアドバイスにも耳を傾けてください。ジェネレータの出力を破棄する場合は、ジェネレータを実行せずに要素の数を計算する方法、または別の方法で要素を数える方法がある可能性が非常に高くなります。

おすすめ記事