Поиск строки / значения в огромном словаре в Python эффективно - PullRequest
0 голосов
/ 11 мая 2019

Скажите, что я огромный диктат, например, huge_dict={'Key1': 'ABC' , 'Key 2' : 'DEF' ,'KEY 4' :'GHI', 'KEY5': 'IJK' ... , 'KEY N': 'XYZ'}
Требуется много времени для поиска значения в огромный_дикт Я пытался использовать многопроцессорную технику, поскольку она использует различные ядра Я пытаюсь выполнить следующие шаги:
1: разделить огромный_диктm small dict
2: создать m процесс в python и передать ему значение поиска
3: если какой-либо процесс получит значение, завершить все процессы.

до этого я загружаю Deep Learning /Модель машинного обучения.при попытке использовать многопроцессорность он загружается как mnay раз, так как мой процесс порожден, чей вывод огромный_dict

 huge_dict = {'Key1': 'ABC' , 'Key 2' : 'DEF' ,'KEY 4' :'GHI', 'KEY5': 'IJK'}
 d1 = dict(huge_dict.items()[len(huge_dict)/2:])
 d2 = dict(huge_dict.items()[:len(huge_dict)/2])
# Is this an efficient  way to do it ? what if  I split in n dict 

def worker(dict , searck_value, num):
    """thread worker function"""
    print('Worker:', num)
    print(mp.cpu_count())
    return dict
#is is correct way to use multiprocessing

#current using  time consuming logic:
def search(d, word)
d = {'key1': "ASD", 'key2': "asd", 'key3':"fds", 'key4':"gfd", 'key5': "hjk"}
for key in d:
    if(d[key] in "search sentence or grp of words")#doing fuzzy search here
        return d[key]

Формат данных следующий:

huge_dict={"10001": ["sentence1", "sentence2","sentence3","sentence4"],
       "4001": ["sentence1", "sentence2"], 
"35432": ["sentence1", "sentence2","sentence3","sentence4", ... "sentence N"],  
.....
"N":["N no of sentences"]    }

1 Ответ

0 голосов
/ 11 мая 2019

Я предполагаю, что вы хотите проверить, присутствует ли какое-либо из значений huge_dict как подстрока (не только слово) в данной строке.
Попробуйте, если set.intersection из huge_dict.values() и все подстроки данногострока быстрее:

def sub(s):
    """ Return all substrings of a given string """
    return [s[i:j+1] for i in range(len(s)) for j in range(i,len(s))]


huge_dict = {'Key1': 'ABC' , 'Key 2' : 'DEF' ,'KEY 4' :'GHI', 'KEY5': 'IJK'}
s = "A REKDEFY, CI"

huge_values = set(huge_dict.values())
>>> print(huge_values.intersection(sub(s))
{'DEF'}

...