在回答增加一组数字之间差异的笨拙计算问题时,有没有更漂亮的方法?,我想出了两种解决方案,一种使用 itertools.starmap List Comprehension
,另一种使用itertools.starmap。
对我来说,list comprehension
语法看起来更清晰、更易读、更简洁、更 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
函数,但需要额外导入 from 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