PyPy-STMを試す

PyPy-STMというPython実装がリリースされていたことを知ったので調べてみました。

PyPy-STMとは <http://doc.pypy.org/en/latest/stm.html#software-transactional-memory>

a special in-development version of PyPy which can run multiple independent CPU-hungry threads in the same process in parallel. It is a solution to what is known in the Python world as the “global interpreter lock (GIL)” problem — it is an implementation of Python without the GIL.

参考訳(私の翻訳なので、正確ではありません)

複数の独立したCPUバウンドのスレッドを同じプロセスで並行して走らせることができる、特別な開発中のPyPyのバージョンです。これはPython界で「グローバルインタプリタロック(GIL)」として知られる問題を解決する — GILなしのPython実装です。

これまで、Pythonでマルチコアを活かすには、 multiprocessing モジュール等を使用する必要がありましたが、PyPy-STMなら、 threading だけでマルチコアを活かすことができるようです。

テストに用いるプログラム

フィボナッチ数列を100000項計算する関数を、10スレッドで計算するプログラムと、1スレッドで10ループしるプログラムを用意しました。これをPyPy-STMとその他Pythonで実行します。

import threading


def fib(limit):
    count = 1
    n, m = 0, 1
    while count < limit:
        n, m = m, n + m
        count += 1

threads = []
for i in range(10):
    thread = threading.Thread(target=lambda: fib(100000))
    thread.start()
    threads.append(thread)

for thread in threads:
    thread.join()
def fib(limit):
    count = 1
    n, m = 0, 1
    while count < limit:
        n, m = m, n + m
        count += 1

for i in range(10):
    fib(100000)

結果

要した秒数を載せていますので、数字が小さいほど優秀です。

/マルチスレッドシングルスレッド
CPyhon 2.7.101.491.32
CPython 3.5.01.401.35
PyPy-STM 2.5.13.662.09
PyPy3 2.4.01.140.97

今回のようなネットワークへのアクセスなどを伴わない処理なので、GILによってPythonはマルチスレッドの恩恵に預かれなません。そのため、マルチスレッドに関する処理が増えている分、マルチスレッド版がシングルスレッド版よりも遅いのは、想定通りの結果です。 しかしながら、PyPy-STMまでもマルチスレッド版の方が遅いという結果になってしまいました。確かに複数コアを使用しているようですが、なぜこうなってしまったのかは分かっていません。また、PyPy-STMが通常のPyPyよりもシングルスレッド性能に劣ることは、 ドキュメント に記されています。

コメント

2015 - 2017 (c) 成瀬基樹