Вот тесты нескольких различных методов:
from __future__ import print_function
import timeit
from operator import itemgetter
def f1(d, l):
'''map'''
return list(map(d.get, l))
def f2(d, l):
'''itemgetter'''
return itemgetter(*l)(d)
def f3(d, l):
'''list comprehension'''
return [d[k] for k in l]
def f4(d, l):
'''WRONG, but map and filter'''
return list(map(lambda k: d[k], filter(d.get, l)))
def f5(d, l):
'''simple for loop'''
rtr=[]
for e in l:
rtr.append(d[e])
return rtr
def f6(d, l):
'''CORRECTED map, filter '''
return list(map(lambda k: d[k], filter(d.__contains__, l)))
if __name__ == '__main__':
s=10000000
d={'W{}'.format(k):k for k in range(s)}
l=['W{}'.format(x) for x in range(0,s,4)]
times=[]
for f in (f1,f2,f3,f4,f5,f6):
times.append((f.__doc__, timeit.timeit('f(d,l)', setup="from __main__ import f, d, l", number=10)))
for e in sorted(times, key=itemgetter(1)):
print('{:30}{:10.3f} seconds'.format(*e))
Для Python 2.7, печатает:
itemgetter 4.109 seconds
list comprehension 4.467 seconds
map 5.450 seconds
simple for loop 6.132 seconds
CORRECTED map, filter 11.283 seconds
WRONG, but map and filter 11.852 seconds
Python 3.4:
itemgetter 5.196 seconds
list comprehension 5.224 seconds
map 5.923 seconds
simple for loop 6.548 seconds
WRONG, but map and filter 9.080 seconds
CORRECTED map, filter 9.931 seconds
PyPy:
list comprehension 4.450 seconds
map 4.718 seconds
simple for loop 5.962 seconds
itemgetter 7.952 seconds
WRONG, but map and filter 8.962 seconds
CORRECTED map, filter 9.909 seconds
Вы можете видеть, что даже со словарем аналогичного размера (1 000 000 элементов), что означает OP, что простой цикл «для» является конкурентоспособным с более удобными методами. Понимание списка очень конкурентоспособно.
Вы также можете увидеть, что что-то, что выглядит фантазией, не так уж велико.
преждевременная оптимизация есть корень всех зол
Почему вы хотите, чтобы избежать использования для цикла? – Shashank
** Не используйте ** переменные с именем верхнего регистра! ** Не ** повторно использовать имя встроенных модулей только с измененной капитализацией! – kay
Не знаете, как вам это удалось, но похоже, что вы обнаружили ошибку. Обычно вы не можете отмечать более одного ответа как «принятого» (вы должны выбрать тот, который вам больше всего помог). И все же мы здесь, с двумя ответами, отмеченными как принятые. См. [Как этот вопрос получил два принятых ответа?] (Https://meta.stackoverflow.com/q/294342) –