Например, у меня есть такой код
import itertools
from multiprocessing.dummy import Pool as ThreadPool
#combinations is from itertools which makes combinations from 3 elements of array
def build_func(i):
print(i)
operators=[1,2,3,4,5]
size=3
pool = ThreadPool(5)
pool.map(build_func, itertools.combinations(operators,size))
pool.close()
pool.join()
Я хочу создавать потоки из результатов генератора, но это очень медленно и работает неправильно. Если я просто использую
for i in itertools.combinations(operators,size):
build_func(i)
Он работает быстрее, поэтому потоки используются некорректно. Есть ли способ сделать темы полезными?
изменено с примером
Почему вы думаете, что из-за того, что ваш цикл for работает быстрее, используемые потоки были неправильными? Вы автоматически предполагаете, что многопоточная программа будет работать быстрее? Это не относится к делу. Особенно на CPython с GIL. Даже без GIL, учитывая масштаб вашего примера здесь, пул потоков, вероятно, имеет гораздо больше накладных расходов, чем любые выгоды, которые вы получили бы от параллелизма, опять же, даже если предположить (ошибочно), что вы это получаете.
Значит, в таком примере нет способа ускорить работу itertools?
Такой маленький тривиальный пример? Почти наверняка не использую multiprocessing. Есть много компромиссов. multiprocessing — это не волшебство, которым вы посыпаете свой код, чтобы все работало быстрее. См. следующий вопрос: stackoverflow.com/questions/53218164/… В вашем конкретном случае вы используете не несколько процессы, а несколько потоки. Но CPython имеет глобальную блокировку интерпретатора, поэтому в любом случае одновременно может выполняться только один поток в процессе python...






Не могли бы вы поконкретнее сказать о «не работает правильно»? На моей машине работает без ошибок.