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

questionAnswers(3)

yourAnswerToTheQuestion