Я недавно задал этот вопрос, и я изменил одно из решений, которое использует цикл, чтобы вместо него использовать карту. Конечно, в Python3 map()
возвращает итератор и не будет выполнять обратный вызов, пока он не будет повторен. Рассмотрим следующие словарь и функции отображения:
files = {'Code.py': 'Stan', 'Output.txt': 'Randy', 'Input.txt': 'Randy'}
это словарь
mapped = {}
for k, v in files.items():
mapped.setdefault(v, []).append(k)
Работает почти вдвое быстрее, чем:
mapped = {}
any(map(lambda i: mapped.setdefault(i[1],[]).append(i[0]),files.items()))
Мое (необразованное) предположение состоит в том, что создание объекта карты и последующая итерация по нему просто менее эффективны, чем выполнение обратного вызова в реальном цикле. Мой вопрос: есть ли лучший способ использовать map
, который либо выполняет обратный вызов при сборке, или есть более быстрый способ итерации по карте, чем при использовании any
? Для справки: время выполнения каждого из них:
#timeit
#using setdefault with any, lambda, map:
#1.46 µs ± 12.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
#using setdefault with loop:
#826 ns ± 2.75 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)