なぜマルチスレッドでPythonのコードが速くならないのでしょうか？どうすれば直るのか。
Pythonはスレッドセーフのために、GILと呼ばれるGlobal Interpreter Lockでインタプリタへのアクセスを制限しています。残念ながら、この設計上の決定により、複数のスレッドを同時に実行できるマシンであっても、一度に1つのスレッドしかPythonコードを解釈できないように制限されています。
Pythonのコードをデータセットで実行したい場合、データを独立したセグメントに分割できる(データ分割と呼ばれる処理)場合、Pythonのマルチプロセシングライブラリを検討するのがよいでしょう。
例として、arg1という1つの引数を取る関数fooを考え、val1、val2、val3という複数の値に対してfoo関数を実行したいとします。
def foo(arg1):
  # 何かをする
if __name__ == '__main__':
  foo(val1)
  foo(val2)
  foo(val3)
fooを複数のプロセスでまとめて実行させるには、マルチプロセシングプールを使って複数のワーカープロセスを一緒に走らせればよいでしょう:
from multiprocessing import Pool
def foo(arg1):
  # 何かをする
if __name__ == '__main__':
  p = Pool()
  p.map(foo, [val1, val2, val3])
マルチプロセッシングライブラリは、その他にも並列プログラミングのための様々なAPIを提供しています。もっと知りたいと思いませんか？