2017-01-10 16 views
0

Я новичок в python, и я запускаю fuzzywuzzy string matching логический на список с 2 миллионами записей. Код работает, и он также дает результат. Проблема в том, что это крайне медленно. Через 3 часа он обрабатывает только 80 строк. Я хочу ускорить процесс, сделав его обрабатывать сразу несколько строк.Как выполнить многопроцессорную обработку в python на 2-м строках с использованием логической логики строки fuzzywuzzy? Текущий код очень медленный

Если это помогает - я запускаю его на своей машине с 16 ГБ оперативной памяти и 1,9 ГГц двухъядерным процессором.

Ниже приведен код, в котором я запущен.

d = [] 
n = len(Africa_Company) #original list with 2m string records 
for i in range(1,n): 
    choices = Africa_Company[i+1:n] 
    word = Africa_Company[i] 
    try: 
     output= process.extractOne(str(word), str(choices), score_cutoff=85) 
    except Exception: 
     print (word) #to identify which string is throwing an exception 
    print (i) #to know how many rows are processed, can do without this also 
    if output: 
     d.append({'Company':Africa_Company[i], 
        'NewCompany':output[0], 
        'Score':output[1], 
        'Region':'Africa'}) 
    else: 
     d.append({'Company':Africa_Company[i], 
        'NewCompany':None, 
        'Score':None, 
        'Region':'Africa'}) 


Africa_Corrected = pd.DataFrame(d) #output data in a pandas dataframe 

Заранее благодарен!

+1

Передача 'str (выбор)' '' extractOne' кажется неправильным для меня, разве это не просто «выбор»? – mata

ответ

0

Это проблема с ЦП. Путем параллельной работы вы можете просто ускорить его максимум в два раза (потому что у вас есть два ядра). То, что вам действительно нужно сделать, это ускорить работу с одним потоком. Расстояние Левенштейна довольно медленное, поэтому есть много возможностей ускорить процесс.

  1. Использовать обрезку. Не пытайтесь запустить полный fuzzywuzzy матч между двумя строками, если нет способа, который даст хороший результат. Попробуйте найти простой линейный алгоритм, чтобы отфильтровать нерелевантные варианты перед совпадением fuzzywuzzy.
  2. Рассмотрите индексирование. Есть ли способ индексировать список? Например: если ваше соответствие основано на целых словах, создайте хэш-карту, которая отображает слова в строки. Попробуйте сопоставлять только варианты, имеющие хотя бы одно общее слово с текущей строкой.
  3. Предварительная обработка. Есть ли какая-то работа над строками в каждом матче, которую вы можете предварительно обработать? Если, например, ваша реализация Levenshtein начинается с создания наборов из ваших строк, сначала подумайте о создании всех наборов, чтобы вам не приходилось выполнять одну и ту же работу снова и снова в каждом матче.
  4. Есть ли лучший алгоритм для использования? Возможно, расстояние Левенштейна не является лучшим алгоритмом для начала.
  5. Является ли внедрение расстояния Левенштейна оптимальным? Это возвращается к шагу 3 (предварительная обработка). Есть ли еще что-то, что можно сделать для ускорения работы?

Многопроцессорная обработка будет только ускоряться с постоянным коэффициентом (в зависимости от количества сердечников). Индексирование может привести вас к классу более низкой сложности! Поэтому сначала сосредоточьтесь на обрезке и индексировании, затем на шагах 3-5. Только когда вы достаточно выжимаете эти шаги, вы должны рассмотреть возможность многопроцессорности.

 Смежные вопросы

  • Нет связанных вопросов^_^