Внутри класса я использовал многопроцессорность, чтобы иметь возможность использовать все ядра для определенного 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 в отдельный класс, но я хочу понять, что здесь происходит.