Während der Beantwortung der Frage Clunky calculation of differences between an incrementing set of numbers, is there a more beautiful way?, kam ich mit zwei Lösungen, eine mit List Comprehension
und andere mit itertools.starmap
.Wenn `sternmap` über` List Comprehension` bevorzugt werden konnte
Für mich, list comprehension
Syntax sieht luzider, lesbarer, weniger wortreich und mehr Pythonic. Aber immer noch als starmap
ist gut verfügbar in iertools, ich frage mich, es muss einen Grund dafür geben.
Meine Frage ist, wenn starmap
gegenüber List Comprehension
bevorzugt werden könnte?
Hinweis Wenn ihr eine Frage des Stils dann auf jeden Fall es There should be one-- and preferably only one --obvious way to do it.
Head to Head
Ablesbarkeit zählt Vergleich widerspricht. --- LC
Sein wieder eine Frage der Wahrnehmung, aber für mich LC
ist besser lesbar als starmap
. Um starmap
zu verwenden, müssen Sie entweder operator
importieren oder lambda
oder einige explizite multi-variable
Funktion definieren und trotzdem einen Import von itertools
.
Leistung --- 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
Ich denke nicht, dass es fair ist, sie zu vergleichen, wie Sie es taten. Beide Funktionen sollten die Unterschiede zu "Deltas" speichern, da die 'using_star_map' im Moment weniger lesbar ist, da sie alle in einer Zeile sind. Ändere es in: 'deltas = starmap (sub, zip (num [1:], num))' 'sum (deltas)/float (len (nums) -1)' – jamylak
@jamylak: Danke, dass du es aufgezeigt hast. Aber leider ändert sich der Leistungsunterschied nicht. – Abhijit
Es war nicht gemeint, aber wir reden auch über Lesbarkeit. – jamylak