Можно ли разделить нагрузку между потоками/процессами/ядрами?
Python в чистом виде никогда не будет самым быстрым. Хотите быстро - используйте компилируемые языки. Хотите ещё быстрее? Используйте GPU. И, тем не менее, python весьма удобен для создания высокоуровневого интерфейса и контроля за модулями на других языках.
Что касается требовательных к CPU задач (подчёркиваю, не input/output), то это довольно болезненная тема. Из-за GIL треды не будут исполняться на разных ядрах одновременно, однако это можно обойти. Итак, варианты:использовать процессы (модуль multiprocessing, но порождение процесса, в сравнении с тредом, дорогое и поможет только если некая минимальная задача выполнятся достаточно долго);cython (можно отпускать GIL и писать threading-safe код на си);opencl (опять си, вычисления переносятся на совместимый CPU/GPU);Theano (символьная математика, генерирует оптимизированный код, который будет исполняться на CPU или GPU).
Вот великолепная статья по указанным методам. Разумеется, все перечисленное имеет смысл, если задача допускает распараллеливание.
если использовать стороннюю библиотеку.. то скорее всего там уже всё распараллелено.
если своё, то изучай для начала threading