Cuando `starmap` podría preferirse a` List Comprehension`

Mientras responde la preguntaCálculo monótono de las diferencias entre un conjunto creciente de números, ¿hay alguna forma más bella?, Se me ocurrieron dos soluciones, una conList Comprehension y otro usoitertools.starmap.

A mi,list comprehension La sintaxis se ve más lúcida, legible, menos verbosa y más pitónica. Pero aun asístarmap está bien disponible en itertools, me preguntaba, tiene que haber una razón para ello.

Mi pregunta es cuandostarmap podría preferirse aList Comprehension?

Nota Si es una cuestión de estilo entonces definitivamente contradiceThere should be one-- and preferably only one --obvious way to do it.

Comparación cabeza a cabeza

La legibilidad cuenta. ---LC

Es otra vez una cuestión de percepción, pero para míLC es más legible questarmap. Usarstarmap, o bien necesitas importaroperator, o definirlambda o alguna explícitamulti-variable función y sin embargo, la importación adicional deitertools.

Actuación ---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>

Respuestas a la pregunta(3)

Su respuesta a la pregunta