Когда «starmap» может быть предпочтительнее, чем «понимание списка»

Отвечая на вопросНеуклюжий расчет различий между возрастающим набором чисел, есть ли более красивый способ?Я придумал два решения, одно сList Comprehension и другое использованиеitertools.starmap.

Мне,list comprehension Синтаксис выглядит более ясным, читабельным, менее многословным и более Pythonic. Но все же какstarmap Мне было интересно, должна быть причина для этого.

Мой вопрос когдаstarmap может быть предпочтительнее, чемList Comprehension?

Note Если это вопрос стиля, то это определенно противоречитThere should be one-- and preferably only one --obvious way to do it.

Head to Head Comparison

Readability counts. --- LC

Это снова вопрос восприятия, но для меняLC более читабельно, чемstarmap. To use starmapЛибо вам нужно импортироватьoperatorили определитьlambda или какой-то явныйmulti-variable функция и тем не менее дополнительный импорт изitertools.

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

Ответы на вопрос(3)

Ваш ответ на вопрос