Это просто общий ответ, но слишком длинный для комментария ...
Прежде всего, я думаю, что вашим самым большим узким местом в данный момент является сам Python. Я не знаю, что делает do_work()
, но если он интенсивно использует процессор, у вас есть GIL, который полностью предотвращает эффективное распараллеливание внутри одного процесса. Независимо от того, что вы делаете, потоки будут бороться за GIL, и это в конечном итоге сделает ваш код еще медленнее. Помните: Python имеет реальную многопоточность, но центральный процессор совместно используется внутри одного процесса. Я рекомендую проверить страницу Дэвида М Бизли: http://dabeaz.com/GIL/gilvis , который приложил много усилий для визуализации поведения GIL в Python.
С другой стороны, модуль multiprocessing
позволяет запускать несколько процессов и «обходить» недостатки GIL, но будет сложно получить доступ к тем же ячейкам памяти без больших штрафов или компромиссов. [1110 ]
Второе: если вы используете тяжелые вложенные циклы, вам следует подумать об использовании numba
и попытках разместить ваши структуры данных внутри numpy
(структурированных) массивов. Это может дать вам порядок скорости довольно легко. Python слишком медленный для таких вещей, но, к счастью, есть способы выжать лот при использовании соответствующих библиотек.
Подводя итог, я думаю, что код, который вы запускаете, может быть на несколько порядков быстрее со структурами numba
и numpy
.
В качестве альтернативы, вы можете попробовать переписать код на языке, подобном Julia
(синтаксис, очень похожий на Python и сообщество, чрезвычайно полезен) и быстро проверить, насколько быстро он работает, чтобы изучить ограничения производительности. Всегда полезно почувствовать, насколько быстро что-то (или части кода) может быть в языке, который не имеет таких сложных критических аспектов производительности, как Python.