Улучшить производительность поиска по словарю в Python - PullRequest
0 голосов
/ 15 марта 2020

Я использую словарную структуру в python для хранения (row, col) из большого массива numpy. Длина объекта словаря составляет почти 100 000

Ключ является кортежем (строка, столбец). Вот некоторые примеры значений в этой структуре:

OrderedDict([((1783, 586), 0), ((1783, 587), 1), ((1783, 588), 2), ((1783, 589), 3), ((1783, 590), 4), ((1784, 584), 5), ((1784, 585), 6), ((1784, 586), 7), ((1784, 587), 8), ((1784, 588), 9), ((1784, 589), 10), ((1784, 590), 11), ((1784, 591), 12), ((1784, 592), 13), ((1784, 593), 14), ((1784, 594), 15), ((1784, 595), 16), ((1785, 583), 17), ((1785, 584), 18), ((1785, 585), 19), ((1785, 586), 20), ((1785, 587), 21), ((1785, 588), 22), ((1785, 589), 23), ((1785, 590), 24), ((1785, 591), 25), ((1785, 592), 26), ((1785, 593), 27), ((1785, 594), 28), ((1785, 595), 29), ((1785, 596), 30), ((1785, 597), 31),...

Для поиска с использованием ключа обработка выполняется вечно.

Я выполняю поиск, используя (строка, столбец):

if (1783,586) in keyed_var_pixels:

На основании этой записи , использование ключевого слова в для объекта dict должно использовать хеширование. Кажется, что для каждого поиска требуется около 0,02 секунды и всего 30 минут, если он работает для всего набора данных. Это кажется слишком длинным для хешированного поиска. Мне интересно, как я могу улучшить это время выполнения? Или любая альтернативная структура данных для хранения этих значений для быстрого поиска и проверки существования.

Заранее спасибо!

1 Ответ

0 голосов
/ 15 марта 2020

Я провел несколько тестов производительности, а go и двухуровневый словарь быстрее, чем использование кортежа в качестве ключа:

d = { 1783:{ 586:0, 587:1 ... },  ... }

if 1783 in d and 586 in d[1783] : 
    # ...

или вы можете определить пустое значение по умолчанию и сделать это следующим образом :

notFound = dict()
# ... 
if 586 in d.get(1783,notFound):
   # ...

или это:

value = d.get(1783,notFount).get(586,None)
if value is not None:
   # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...