Возможно, вы столкнулись с двумя проблемами.
Один из них был упомянут: вы читаете несколько файлов одновременно. Эти чтения в конечном итоге будут чередоваться, вызывая перебивание диска. Вы хотите прочитать целые файлы сразу, а затем только многопоточность вычислений на данных.
Во-вторых, у вас перегружены многопроцессорные модули Python. Это на самом деле не использование потоков, а запуск нескольких процессов и сериализация результатов по конвейеру. Это очень медленно для больших объемов данных - фактически, это кажется медленнее, чем работа, которую вы делаете в потоке (по крайней мере, в примере). Это реальная проблема, вызванная GIL.
Если я изменю do (), чтобы вернуть None вместо container.items (), чтобы отключить дополнительную копию данных, этот пример на быстрее, чем отдельный поток, если файлы уже кэшированы
Два потока: 0,36 прошло 168% ЦП
Один поток (замените файл pool.map на карту): 0: 00.52 прошло 98% ЦП
К сожалению, проблема GIL является фундаментальной и не может быть решена изнутри Python.