Когда `звездная карта `может быть предпочтительнее `Понимание списка`

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

На мой взгляд, list comprehensionсинтаксис выглядит более понятным, читабельным, менее многословным и более питоническим. Но все же, поскольку звездная карта хорошо доступна в itertools, мне было интересно, для этого должна быть причина.

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

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

Прямому сравнению

Удобочитаемость учитывается.---LC

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

Производительность---LC

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

7
задан Jonathan 25 May 2019 в 19:39
поделиться