2016-09-28 7 views
0
def numbers(mi, ma): 
    return [n for n in range(mi, ma + 1)] 

def gen(xs): 
    return (x for x in xs) 

example = gen(numbers(10, 20)) 

この例では、genは繰り返しのパフォーマンスがnumbersに向上しますか?何故なの)?リストを生成してPythonのパフォーマンスを改善できますか?

def numbersGen(mi, ma): 
    return gen([n for n in range(mi, ma + 1)]) # Generator from list comprehension? 

パイソンはハスケルほど怠け者になりますか?

+1

基本的に異なる動作をするため、Pythonは '怠け者'のHaskellになることはできません。示されたコードでは、リストは*から*作成されます。ジェネレータでラップされたのは返されたリストです。同じことが「直接」形式にも当てはまります。ジェネレータがすでに実現されているリストの反復よりも何らかの方法で「反復処理が速い」場合は、私は非常に疑問に思うでしょう。 – user2864740

+0

私はPythonの基本的な操作命令を理解しています。最適化のメリットや構文的な特質があるかどうかは疑問だ。 – suchtgott

+0

Pythonはこのようなケースを最適化することはほとんどできません。それぞれの式は、実行されたときに値を求めて評価されてから、次のものに供給されます。これは、最も一般的な言語(JavaScriptからC#へ)に似ており、純粋な関数言語であるHaskellとは大きく異なる基本的なアプローチです。 Pythonプログラムは、ソースの事前マテリアライゼーションなしでジェネレータを使用するなど、選択した怠惰を追加する必要があります。 – user2864740

答えて

0

この具体的なケースでは、rangeはすでにあなたが望むほど怠惰です。アウトプットのレイヤーで出力をさらにラップする理由はありません。もちろん、PythonジェネレータとHaskellの怠惰の通常の警告が適用されます。つまり、複数回繰り返したり、特定のポイントから何度も繰り返したりすることは、Pythonでは苦労しますが、その結果、一般的にはメモリ使用量が予測可能になります。

+1

Python 3では、 'range'は' xrange'でした。 – suchtgott

+0

@mentalCaseお役立ち情報私は私の答え、感謝を更新しました。 –

関連する問題