Отображать потоки с помощью itertools

Например, у меня есть такой код

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)

Он работает быстрее, поэтому потоки используются некорректно. Есть ли способ сделать темы полезными?

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

Reedinationer 05.03.2019 22:55

изменено с примером

Станислав Китаев 05.03.2019 22:57

Почему вы думаете, что из-за того, что ваш цикл for работает быстрее, используемые потоки были неправильными? Вы автоматически предполагаете, что многопоточная программа будет работать быстрее? Это не относится к делу. Особенно на CPython с GIL. Даже без GIL, учитывая масштаб вашего примера здесь, пул потоков, вероятно, имеет гораздо больше накладных расходов, чем любые выгоды, которые вы получили бы от параллелизма, опять же, даже если предположить (ошибочно), что вы это получаете.

juanpa.arrivillaga 05.03.2019 23:02

Значит, в таком примере нет способа ускорить работу itertools?

Станислав Китаев 05.03.2019 23:04

Такой маленький тривиальный пример? Почти наверняка не использую multiprocessing. Есть много компромиссов. multiprocessing — это не волшебство, которым вы посыпаете свой код, чтобы все работало быстрее. См. следующий вопрос: stackoverflow.com/questions/53218164/… В вашем конкретном случае вы используете не несколько процессы, а несколько потоки. Но CPython имеет глобальную блокировку интерпретатора, поэтому в любом случае одновременно может выполняться только один поток в процессе python...

juanpa.arrivillaga 05.03.2019 23:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
65
0

Другие вопросы по теме