増加する一連の数値間の差の不格好な計算という質問に答えながら、もっと美しい方法はありますか? 、 itertools.starmap を使用するソリューションと、 itertools.starmapList Comprehension
を使用するソリューションの 2 つのソリューションを思いつきました。
私にとって、list comprehension
Syntax はより明快で読みやすく、冗長ではなく、より Pythonic に見えます。しかし、スターマップはitertoolsで十分に利用できるので、それには理由があるはずだと思っていました。
私の質問はいつstarmap
優先されるのList Comprehension
ですか?
注スタイルの問題である場合、それは間違いなく矛盾していますThere should be one-- and preferably only one --obvious way to do it.
直接比較
読みやすさが重要です。---LC
これも認識の問題ですが、私にとってLC
は より読みやすいですstarmap
。を使用するには、明示的な関数をインポートするか定義するstarmap
必要がありますが、それでも から追加のインポートが必要です。operator
lambda
multi-variable
itertools
パフォーマンス ---LC
>>> def using_star_map(nums):
delta=starmap(sub,izip(nums[1:],nums))
return sum(delta)/float(len(nums)-1)
>>> def using_LC(nums):
delta=(x-y for x,y in izip(nums[1:],nums))
return sum(delta)/float(len(nums)-1)
>>> nums=[random.randint(1,10) for _ in range(100000)]
>>> t1=Timer(stmt='using_star_map(nums)',setup='from __main__ import nums,using_star_map;from itertools import starmap,izip')
>>> t2=Timer(stmt='using_LC(nums)',setup='from __main__ import nums,using_LC;from itertools import izip')
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=1000)/100000)
235.03 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=1000)/100000)
181.87 usec/pass