Gdy `stapap` może być preferowany nad` Rozumienie listy`

Odpowiadając na pytanieClunky obliczanie różnic między rosnącym zestawem liczb, czy jest piękniejszy sposób?, Wymyśliłem dwa rozwiązania, jedno zList Comprehension i inne używanieitertools.starmap.

Dla mnie,list comprehension Składnia wygląda na bardziej przejrzystą, czytelną, mniej gadatliwą i bardziej Pythoniczną. Ale wciąż jakstarmap jest dobrze dostępny w itertools, zastanawiałem się, musi być jakiś powód.

Moje pytanie brzmi: kiedystarmap może być preferowanyList Comprehension?

Uwaga Jeśli jest to kwestia stylu, to zdecydowanie zaprzeczaThere should be one-- and preferably only one --obvious way to do it.

Porównanie Head to Head

Liczy się czytelność. ---LC

To znowu kwestia percepcji, ale dla mnieLC jest bardziej czytelny niżstarmap. Używaćstarmap, albo musisz zaimportowaćoperatorlub zdefiniujlambda lub niektóre wyraźnemulti-variable funkcja, a mimo to dodatkowy import zitertools.

Wydajność ---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>

questionAnswers(3)

yourAnswerToTheQuestion