Как использовать параллельную обработку для вызова одной и той же функции несколько раз? - PullRequest
0 голосов
/ 03 февраля 2020

Как сделать эту задачу намного быстрее, чтобы закончить? 3 вызова метода generate_ngrams_from_file () могут выполняться параллельно? Просто зайдите в python и не знаете, как сделать это быстрее. Я думаю, что многопроцессорная обработка или многопоточность должны выполнять эту работу, но не знаю, как это сделать. Похоже, что типичная задача может быть выполнена одновременно для использования нескольких ядер на моей машине Ma c.

def tokenize(text):
   return [token for token in text.split(' ')]

def generate_ngrams(text, n):

    tokens = tokenize(text)

    ngrams = zip(*[tokens[i:] for i in range(n)])

    return [''.join(ngram) for ngram in ngrams]

def generate_ngrams_from_file(input, out, n):
    count = 0
    with open(input, 'r') as f:
        for line in f:
            count += 1
            if line:
                ngrams = generate_ngrams(line, n)
                if n == 2:
                    bigrams.update(ngrams)
                elif n == 3:
                    trigrams.update(ngrams)
                elif n == 4:
                    fourgrams.update(ngrams)
                elif n == 5:
                    fourgrams.update(ngrams)

    print("Ngram done!")

if __name__ == "__main__":
    start = time.time()

    input_file = 'bigfile.txt'
    output_3_tram = '3gram.txt'
    output_4_tram = '4ngram.txt'
    output_5_tram = '5ngram.txt'

    print('Generate trigram: ')
    generate_ngrams_from_file(input_file, output_3_tram, 3)

    print("Generate fourgrams: ")
    generate_ngrams_from_file(input_file, output_4_tram, 4)

    print("Generate fivegrams: ")
    generate_ngrams_from_file(input_file, output_5_tram, 5)

    end = time.time()
    mytime(start, end)

1 Ответ

0 голосов
/ 03 февраля 2020

Многопоточность в Python не очень хорошая идея из-за функции глобальной блокировки интерпретатора Python. Вы можете прочитать об этом здесь https://www.geeksforgeeks.org/what-is-the-python-global-interpreter-lock-gil/. Многопроцессорная обработка - лучший вариант для ускорения ваших программ. Вы можете поместить функцию generate_ngrams() в класс Process модуля multiprocessing. Читайте о Process классе в https://docs.python.org/2/library/multiprocessing.html. Класс Process рекомендуется, так как он быстрее, чем pool.apply() и pool.apply_async()

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