When`starmap` poderia ser preferível ao invés de `List Compreensão`
Ao responder a perguntaClunky cálculo das diferenças entre um conjunto incremental de números, há uma maneira mais bonita?, Eu criei duas soluções, uma comList Comprehension
e outro usandoitertools.starmap
.
Para mim,list comprehension
A sintaxe parece mais lúcida, legível, menos detalhada e mais pitônica. Mas ainda comostarmap
está bem disponível em itertools, eu queria saber, tem que haver uma razão para isso.
Minha pergunta é quandostarmap
poderia ser preferido ao longoList Comprehension
?
Nota Se é uma questão de estilo, então definitivamente contradizThere should be one-- and preferably only one --obvious way to do it.
Comparação frente a frente
A legibilidade conta. ---LC
É novamente uma questão de percepção, mas para mimLC
é mais legível do questarmap
. Usarstarmap
, você precisa importaroperator
ou definirlambda
ou algum explícitomulti-variable
função e, no entanto importação extra deitertools
.
atuação ---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>