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