2012-03-15 10 views
1

時間の処理やメモリの使用などの点で、イテレーションが優れているかラムダ関数が優れていますか?例えばラムダ関数はより良いか反復ですか?

x = [10, 20, 30] 

for y in x: 
    if y>10 or y<20: 
     print y 

これが良いかラムダ関数のですか? 私は、時間処理、メモリ使用、または他の比較に関して答えを求めています。

+0

なぜダウン?これはうんざりです。 – sam

答えて

3

新しいリストやジェネレータを作成したくないので、古典的なループは明らかに優れています。

このようなオブジェクトを作成しないとメモリ効率が向上し、各要素に関数を呼び出さないとパフォーマンスが向上しません。

5

イテレータとラムダは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を参照してください。

1

特に、マッピングされる式の複雑さが増すにつれて、リスト表記法が関数表記法よりも読みやすくなります。さらに、リストの理解度は、マップとラムダを使用するソリューションよりもはるかに高速に実行されます。これは、ラムダ関数を呼び出すと新しいスタックフレームが作成され、リスト内包表記の式は新しいスタックフレームを作成せずに評価されるからです。 >>http://python-history.blogspot.com/2010/06/from-list-comprehensions-to-generator.html

言い換えれば、ラムダとループ/理解/ジェネレータのどちらを選択するかは、後者を使用します。私はあなたの例を書くための最もpythonicな方法は、何かのようになるだろうと思います

print [y for y in x if y < 20] 
関連する問題