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?
パイソンはハスケルほど怠け者になりますか?
基本的に異なる動作をするため、Pythonは '怠け者'のHaskellになることはできません。示されたコードでは、リストは*から*作成されます。ジェネレータでラップされたのは返されたリストです。同じことが「直接」形式にも当てはまります。ジェネレータがすでに実現されているリストの反復よりも何らかの方法で「反復処理が速い」場合は、私は非常に疑問に思うでしょう。 – user2864740
私はPythonの基本的な操作命令を理解しています。最適化のメリットや構文的な特質があるかどうかは疑問だ。 – suchtgott
Pythonはこのようなケースを最適化することはほとんどできません。それぞれの式は、実行されたときに値を求めて評価されてから、次のものに供給されます。これは、最も一般的な言語(JavaScriptからC#へ)に似ており、純粋な関数言語であるHaskellとは大きく異なる基本的なアプローチです。 Pythonプログラムは、ソースの事前マテリアライゼーションなしでジェネレータを使用するなど、選択した怠惰を追加する必要があります。 – user2864740