Многопроцессорная обработка чрезвычайно медленная после установки CountVectorizer - PullRequest
1 голос
/ 18 апреля 2020

Внутри класса я использовал многопроцессорность, чтобы иметь возможность использовать все ядра для определенного c метода. Это работало отлично, пока я не добавил (sklearn) CountVectorizer в класс. Каким-то образом, после того, как CountVectorizer установлен, async_method становится чрезвычайно медленным. Я понятия не имею, что вызывает эту проблему, тем более что нет никакой связи между CountVectorizer и async_method. Я написал небольшой фрагмент воспроизводимого кода, демонстрирующий проблему:

import random
import multiprocessing as mp
import string
from sklearn.feature_extraction.text import CountVectorizer
from datetime import datetime


class ProblemClass:
    def __init__(self):
        self.cv = CountVectorizer()

    def random_function(self, max_wait):
        some_number = random.randint(0, max_wait)
        return some_number

    def async_method(self, some_list):
        cpu_count = mp.cpu_count()
        with mp.Pool(cpu_count - 1) as pool:
            result = [pool.apply_async(self.random_function, args=[row]) for row in some_list]
            result = [r.get() for r in result]
        return result

def timeit(func, *args):
    start = datetime.now()
    result = func(*args)
    stop = datetime.now()
    print(f"Time it took {stop-start}")
    return stop-start

if __name__ == "__main__":

    # Before fitting countvectorizer
    pc = ProblemClass()
    some_list = random.choices(range(10), k=200)
    time_orig = timeit(pc.async_method, some_list)

    # This is fast, now look what happens when the countvectorizer is fitted
    X = [''.join(random.choices(string.ascii_letters, k=random.randint(2, 10))) for _ in range(10000)]
    pc.cv.fit(X)
    time_after = timeit(pc.async_method, some_list)

    print(f"Why does is take {time_after/time_orig} times longer after fittin a CountVectorizer?")

Вывод:

Время, которое потребовалось 0: 00: 00.051204
Время, которое потребовалось 0:00: 04.937169
Почему теперь это занимает 96,42154909772674 раза дольше?

После установки CountVectorizer требуется примерно в 100 раз больше времени. Любые идеи о том, что может быть причиной этого?

Конечно, я могу поместить async_method или CountVectorizer в отдельный класс, но я хочу понять, что здесь происходит.

...