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ćoperator
lub 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>