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>