Если вы можете придумать способ использовать функции карты (или imap), а не вложенные циклы, вы можете попробовать использовать multiprocessing для полной загрузки вашего процессора.Например, в этом случае:
pool.map(lambda j: map(lambda i: damerau_levenshtein_distance(i, j),original_string),compare_string)
, где 'pool.map' - многопроцессорная карта, а вторая 'map' - обычная.
Ниже приведен быстрый, но функциональный примермногопроцессорной обработки, которая может охватывать то, что вы ищете.Я структурировал его немного по-другому, чтобы избежать некоторых проблем с засолкой и заставить его вычисляться в фоновом режиме несколько асинхронно, так как ваши списки длинные ...
(Это, безусловно, можно улучшить, но, надеюсь, должно послужить доказательствомконцепция для вашего примера)
import multiprocessing as mp
import itertools
list1 = range(5)
list2 = range(5)
def doSomething(a,b):
return a+b #Your damerau_levenshtein_distance function goes here
def mapDoSomething(args):
i = args[0] #An element of list2
otherlist = args[1] #A copy of list1
return [doSomething(i,j) for j in otherlist]
if __name__ == '__main__':
pool = mp.Pool()
answer = pool.imap(mapDoSomething,zip(list2,itertools.repeat(list1)))
print(list(answer)) #imap will compute the results in the background whilst the rest of the code runs. You can therefore ask for individual lists of results, and it won't block unless the result hasn't been computed yet. To do this, you would use answer.next() or iterate over the results somewhere else. However, by converting to a list here, I'm forcing all results to finish before printing. This is only to show you it worked. For larger lists, don't do this.
pool.close()
pool.join()
Этот код производит:
[[0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]]
, каждый из которыхэлемент list1 оперирует (я добавил их) каждым элементом list2, что, я думаю, и есть то, что вы пытались сделать в своем коде со списками строк.
Код устанавливает пул процессов, а затем использует imap для разделения обработки по списку2 между несколькими процессами.Функция zip лениво группирует элемент list2 с полной копией list1, поскольку imap поддерживает функции только с одним аргументом.Затем эта группа разделяется и используется в mapDoSomething, который запускает функцию doSomething для каждого элемента в list1 с каждым элементом list2.
Поскольку я использовал imap, списки печатаются сразу после их вычисления, а не ожидают завершения всего результата.