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 importierenoperatoroder 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>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage