Производительность кода Python снижается из-за многопоточности

Я написал рабочую программу на Python, которая в основном анализирует пакет двоичных файлов, извлекая данные в структуру данных. Разбор каждого файла занимает около секунды, что соответствует часам для тысяч файлов. Я успешно реализовал поточную версию метода пакетного анализа с регулируемым количеством потоков. Я протестировал этот метод на 100 файлах с различным количеством потоков, синхронизируя каждый запуск. Вот результаты (0 потоков относится к моему исходному коду предварительной обработки потоков, 1 поток к новой версии выполняется с одним порожденным потоком).

0 threads: 83.842 seconds
1 threads: 78.777 seconds
2 threads: 105.032 seconds
3 threads: 109.965 seconds
4 threads: 108.956 seconds
5 threads: 109.646 seconds
6 threads: 109.520 seconds
7 threads: 110.457 seconds
8 threads: 111.658 seconds

Хотя создание потока дает небольшое увеличение производительности по сравнению с тем, что основной поток выполняет все работа, увеличение количества потоков на самом деле снижает производительность. Я ожидал увеличения производительности, по крайней мере, до четырех потоков (по одному на каждое ядро ​​моей машины). Я знаю, что потоки связаны с накладными расходами, но я не думал, что это будет иметь такое большое значение для однозначных чисел потоков.

Я слышал о «глобальной блокировке интерпретатора», но когда я перешел на четыре потока, я действительно вижу соответствующее количество ядер в работе - с двумя потоками два ядра показывают активность во время синтаксического анализа и т. д.

Я также протестировал несколько разных версий кода синтаксического анализа, чтобы увидеть, связана ли моя программа с вводом-выводом. Не похоже; просто чтение файла занимает относительно небольшую часть времени; обработка файла - это почти все. Если я не выполняю ввод-вывод и не обрабатываю уже прочитанную версию файла, добавление второго потока снижает производительность, а третий поток немного улучшает ее. Мне просто интересно, почему я не могу воспользоваться преимуществами нескольких ядер моего компьютера, чтобы ускорить процесс. Пожалуйста, опубликуйте любые вопросы или способы, которыми я могу уточнить.

27
задан dpitch40 25 July 2011 в 19:47
поделиться