Когда «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>