Podczas odpowiadania na pytanie Clunky calculation of differences between an incrementing set of numbers, is there a more beautiful way?, znalazłem dwa rozwiązania, jeden z List Comprehension
i inne przy użyciu itertools.starmap
.Kiedy `starmap` może być preferowany zamiast `List Comprehension`
Dla mnie, list comprehension
Składnia wygląda na bardziej przejrzystą, czytelną, mniej gadatliwą i bardziej Pythoniczną. Ale wciąż jako starmap
jest dobrze dostępny w itertools, zastanawiałem się, musi być powód dla niego.
Moje pytanie brzmi, kiedy starmap
może być preferowany nad List Comprehension
?
Uwaga Jeśli jego sprawą Style to zdecydowanie zaprzecza There should be one-- and preferably only one --obvious way to do it.
Head to Head Porównanie
Czytelność liczy. --- LC
Its znowu kwestia percepcji, ale mi LC
jest bardziej czytelny niż starmap
. Aby użyć starmap
, należy zaimportować operator
lub zdefiniować lambda
lub pewną jawną funkcję multi-variable
, a mimo to dodatkowy import z itertools
.
Wydajność --- 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
Nie sądzę, że to sprawiedliwe, aby porównać je tak, jak ty. Obie funkcje powinny zapisać różnice do 'deltas', ponieważ w chwili obecnej' using_star_map' jest mniej czytelny, ponieważ wszystko znajduje się w jednym wierszu. Zmień go na: 'deltas = starmap (sub, zip (num [1:], nums))' 'sum (deltas)/float (len (nums) -1)' – jamylak
@jamylak: Dziękuję za wskazanie tego. Ale niestety nie zmienia to różnicy w wydajności. – Abhijit
Nie miało to na celu, ale mówimy również o czytelności. – jamylak