Wenn "Sternenkarte" gegenüber "Listenverständnis" vorgezogen werden könnte
Bei der Beantwortung der FrageGibt es eine schönere Möglichkeit, umständliche Differenzen zwischen einer inkrementellen Menge von Zahlen zu berechnen?Ich habe zwei Lösungen gefunden, eine mitList Comprehension
und andere verwendungitertools.starmap
.
Mir,list comprehension
Die Syntax wirkt klarer, lesbarer, weniger ausführlich und pythonischer. Aber immer noch alsstarmap
ist gut verfügbar in itertools, ich habe mich gefragt, es muss einen Grund dafür geben.
Meine Frage ist wannstarmap
könnte vorgezogen werdenList Comprehension
?
Hinweis Wenn es um Stil geht, widerspricht es definitivThere should be one-- and preferably only one --obvious way to do it.
Kopf-an-Kopf-Vergleich
Lesbarkeit zählt. ---LC
Es ist wieder eine Frage der Wahrnehmung, aber für michLC
ist lesbarer alsstarmap
. Benutzenstarmap
, entweder müssen Sie importierenoperator
oder definierenlambda
oder einige explizitemulti-variable
funktionieren und trotzdem extra importieren ausitertools
.
Performance ---LC
<code>>>> 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 </code>