Язык Python предшествует многоядерным процессорам, поэтому не странно, что он не использует их изначально.
Кроме того, не все программы могут получать прибыль от нескольких ядер. Вычисление, выполненное поэтапно, где следующий шаг зависит от результатов предыдущего шага, не будет быстрее при использовании большего количества ядер. Проблемы, которые можно векторизовать (применяя одни и те же вычисления к большим массивам данных), можно относительно легко использовать с использованием нескольких ядер, поскольку отдельные вычисления независимы.
Когда вы делаете много расчетов, я предполагаю, что вы используете NumPy ? Если нет, проверьте это. Это расширение, написанное на C, которое может использовать оптимизированные библиотеки линейной алгебры, такие как ATLAS. Это может значительно ускорить численные расчеты по сравнению со стандартным Python.
Сказав это, есть несколько способов использовать несколько ядер с Python.
- Встроенный
multiprocessing
модуль. multiprocessing.Pool
Класс предоставляет векторизации по нескольким процессорам с map()
и связанными с ними методами. Здесь есть компромисс здесь. Если вам приходится передавать большие объемы данных между процессами, то эти издержки могут свести на нет преимущество нескольких ядер.
- Используйте подходящую сборку NumPy. Если numpy построен с использованием многопоточной библиотеки ATLAS, это будет быстрее при больших проблемах.
- Используйте модули расширения, такие как NumberxPr , параллельный Python , CorePy или Copenhagen Vector Byte Code .
Обратите внимание, что threading
модуль не так уж полезен в этом отношении. Для простоты управления памятью глобальная блокировка интерпретатора («GIL») обеспечивает выполнение только одного потока за раз байт-кодом Python. Внешние модули, такие как numpy, могут использовать несколько потоков внутри.