Поиск быстрых псевдонимов по умолчанию в Python - PullRequest
3 голосов
/ 24 января 2010

Есть ли более быстрый способ сделать следующее для гораздо больших диктов?

aliases = {
            'United States': 'USA',
            'United Kingdom': 'UK',
            'Russia': 'RUS',
          }
if countryname in aliases: countryname = aliases[countryname]

Ответы [ 4 ]

6 голосов
/ 24 января 2010

Ваше решение в порядке, так как "in" равно 0 (1) для словарей.

Вы можете сделать что-то вроде этого, чтобы сохранить набор текста:

countryname = aliases.get(countryname, countryname)

(но я считаю, что ваш код намного легче читать)

Когда дело доходит до скорости, то какое решение лучше всего, будет зависеть от того, будет ли большинство «попаданий» или «промахов». Но это, вероятно, будет в наносекундном диапазоне, когда дело доходит до различий.

2 голосов
/ 24 января 2010

Если ваш список умещается в памяти, диктовки - самый быстрый путь. Как указывает С.Марк, вы выполняете два поиска, из которых один будет выполнять:

countryname = aliases.get(countryname, countryname)

(который оставит название страны без изменений, если его нет в словаре), или:

try:
    countryname = aliases[countryname]
except KeyError:
    pass
1 голос
/ 24 января 2010

Доступ с помощью .get может быть быстрее, чем проверка и присвоение переменной

aliases.get(countryname)

И если название страны не существует в псевдонимах, оно вернет None.

0 голосов
/ 24 января 2010

Если ваш словарь очень большой и вы ожидаете, что многие из ваших проверок не найдут совпадения, то вы можете рассмотреть фильтр Блума или один из его производных и разрешить ложные срабатывания.

В качестве альтернативы, поскольку ваши ключи могут быть отсортированы (и / или иметь производные значения), вы можете реализовать деление пополам или другой поиск корня .

Во-первых, я бы точно выяснил, как Python осуществляет поиск по словарю, так что вы не просто заново изобретаете колесо.

Кроме того, их реализация на чистом Python может быть довольно медленной, если она включает много итераций. Рассмотрим Cython, Numpy или F2Py, чтобы по-настоящему оптимизировать.

(если вы имеете дело только с названиями стран, то я не думаю, что вы имеете дело с сопоставлениями, достаточно большими, чтобы оправдать какие-либо из моих предложений), но если вы собираетесь выполнить какую-то реализацию проверки орфографии, тогда ..

Удачи.

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