Вы не можете ускорить его, используя многопоточность из-за Глобальной блокировки интерпретатора .Определенное внутреннее состояние интерпретатора Python защищено этой блокировкой, которая предотвращает одновременную работу разных потоков, которым необходимо изменить это состояние.
Вы могли бы ускорить его, порождая реальные процессы с использованием multiprocessing
.Каждый процесс будет выполняться в своем собственном интерпретаторе, что позволяет обойти ограничение потоков.С помощью многопроцессорной обработки вы можете использовать разделяемую память или предоставить каждому процессу свою собственную копию / раздел данных.
В зависимости от вашей задачи вы можете распараллелить обработку одного изображения, разделив его, или выМожно распараллелить обработку списка изображений (последнее легко сделать с помощью pool
).Если вы хотите использовать первое, вы можете сохранить изображение в Array
, к которому можно обращаться как к общей памяти, но вам все равно придется решить проблему, где записывать результаты(запись в общую память может сильно ухудшить производительность).Также обратите внимание, что определенные виды связи между процессами (очереди, каналы или передача параметра / возвращаемого значения некоторой функции в модуле) требуют сериализации данных с использованием Pickle .Это накладывает определенные ограничения на данные и может привести к значительному снижению производительности (особенно если у вас много небольших задач).
Еще один способ улучшить производительность таких операций - попробовать записать их в Cython , который имеет собственную поддержку распараллеливания с использованием OpenMP - хотя я никогда не использовал это, поэтому не знаю, насколько это может помочь.