時間の処理やメモリの使用などの点で、イテレーションが優れているかラムダ関数が優れていますか?例えばラムダ関数はより良いか反復ですか?
:
x = [10, 20, 30]
for y in x:
if y>10 or y<20:
print y
これが良いかラムダ関数のですか? 私は、時間処理、メモリ使用、または他の比較に関して答えを求めています。
時間の処理やメモリの使用などの点で、イテレーションが優れているかラムダ関数が優れていますか?例えばラムダ関数はより良いか反復ですか?
:
x = [10, 20, 30]
for y in x:
if y>10 or y<20:
print y
これが良いかラムダ関数のですか? 私は、時間処理、メモリ使用、または他の比較に関して答えを求めています。
新しいリストやジェネレータを作成したくないので、古典的なループは明らかに優れています。
このようなオブジェクトを作成しないとメモリ効率が向上し、各要素に関数を呼び出さないとパフォーマンスが向上しません。
イテレータとラムダは2つの全く異なるものです。ラムダは単純なインライン関数であり、イテレータは連続するオブジェクトを返すオブジェクトです。あなたの例には2つの大きな問題があります:y
の代わりにx
をテストし、x
のすべての値がy>10 or y<20
のために渡されます。だから、それらを修正、あなたの例では、イテレータとこのようなラムダを使って書くことができます
for value in filter(lamdba y: y < 10 or y > 20, x):
print(value)
あり、あなたがこれを行うことができ、いくつかの方法がありますが、パフォーマンスの面で、それはあなたがしているものをデータに依存しますどのように処理しているのか、どのくらい処理しているのかを知ることができます。便利なガイドについては、http://wiki.python.org/moin/PythonSpeed/PerformanceTipsを参照してください。
特に、マッピングされる式の複雑さが増すにつれて、リスト表記法が関数表記法よりも読みやすくなります。さらに、リストの理解度は、マップとラムダを使用するソリューションよりもはるかに高速に実行されます。これは、ラムダ関数を呼び出すと新しいスタックフレームが作成され、リスト内包表記の式は新しいスタックフレームを作成せずに評価されるからです。 >>http://python-history.blogspot.com/2010/06/from-list-comprehensions-to-generator.html
言い換えれば、ラムダとループ/理解/ジェネレータのどちらを選択するかは、後者を使用します。私はあなたの例を書くための最もpythonicな方法は、何かのようになるだろうと思います
print [y for y in x if y < 20]
なぜダウン?これはうんざりです。 – sam