Самый быстрый способ перебора карты Python3 - PullRequest
0 голосов
/ 26 апреля 2018

Я недавно задал этот вопрос, и я изменил одно из решений, которое использует цикл, чтобы вместо него использовать карту. Конечно, в 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)

1 Ответ

0 голосов
/ 26 апреля 2018

Ответ на этот вопрос прост, спасибо @ Aran-Fey за обучение. Это не очень хороший вариант использования для map и any, потому что цикл не предназначен для возврата чего-либо, скорее он предназначен для изменения словаря на месте. Использование map и any имеет нежелательные побочные эффекты, связанные с созданием объекта карты и возвращением логического значения после итерации по нему, ни один из которых не является необходимым. Помимо того, что мой «один вкладыш» менее читабелен, он генерирует два нежелательных выхода, в то время как обычный цикл такого не делает. Таким образом, мой метод обладает вдвое меньшим быстродействием во время выполнения, но также имеет нежелательные побочные эффекты и поэтому не должен использоваться просто и просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...