Мова Python передує багатоядерним процесорам, тому не дивно, що він не використовує їх власне.
Крім того, не всі програми можуть отримати прибуток від декількох ядер. Розрахунок, виконаний кроками, де наступний крок залежить від результатів попереднього кроку, не буде швидшим, використовуючи більше ядер. Проблеми, які можна векторизувати (застосовуючи один і той самий обчислення до великих масивів даних), можна порівняно легко зробити декількома ядрами, оскільки окремі обчислення не залежать.
Коли ви робите багато розрахунків, я припускаю, що ви використовуєте numpy ? Якщо ні, перевірте це. Це розширення, написане на C, яке може використовувати оптимізовані бібліотеки лінійних алгебр, таких як ATLAS. Це може значно прискорити числові обчислення порівняно зі стандартним Python.
Сказавши це, існує кілька способів використання декількох ядер з python.
- Вбудований
multiprocessing
модуль. multiprocessing.Pool
Клас надає векторизації по декільком процесорам з map()
і пов'язаними з ними методами. Тут є компроміс. Якщо вам доведеться передавати велику кількість даних між процесами, то накладні витрати можуть заперечувати перевагу декількох ядер.
- Використовуйте підходящу конструкцію з нумію. Якщо numpy побудований з багатопотоковою бібліотекою ATLAS, це буде швидше при великих проблемах.
- Використовуйте модулі розширення, такі як numexpr , паралельний пітон , corepy або кодекс Байта .
Зауважте, що threading
модуль не є таким корисним у цьому плані. Щоб забезпечити просте управління пам’яттю, глобальне блокування інтерпретатора («GIL») застосовує, що лише один потік одночасно може виконувати байт-код python. Однак зовнішні модулі, такі як numpy, можуть використовувати декілька потоків всередині.