ページ

2008年10月7日

Python 2.6のmultiprocessingで性能を見てみる

Python2.6がリリースされて,気になっていたmultiprocessingとthreadを比較してみました。動作マシンは,MacBookでCore2Duoの2Gです。時間がないので,サンプルコードはかなり必要最小限になっています。ロック関係のオーバーヘッドがないようにthreadはjoinせずにsleepして終了するのを待っています(本当は結果が速く見たかったのでさぼった)。

それから,fibonacciは適当に重そうな処理だったので選んだけで深い意味はないです。

threadを使ったサンプルコード

import time
import thread
import threading
import sys

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

def doInThread(i):
    start = time.time()
    for x in range(0, 30):
        result = fibonacci(x)
    end = time.time()
    print "%d Time %d sec" % (i, end - start)


if __name__ == "__main__":
    count = 1
    if len(sys.argv) >1:
        count = int(sys.argv[1])
    for i in range(0, count):
        thread.start_new_thread(doInThread, (i,))
    time.sleep(300)
multiprocessingを使ったサンプルコード

import time
import sys
from multiprocessing import Process

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

    def doInThread(i):
        start = time.time()
        for x in range(0, 30):
            result = fibonacci(x)
        end = time.time()
        print "%d Time %d sec" % (i, end - start)


if __name__ == "__main__":
    count = 1
    if len(sys.argv) >1:
        count = int(sys.argv[1])
    for i in range(0, count):
        Process(target=doInThread, args=(i,)).start()
です。これで,それぞれ,スレッド数を増やしていって処理時間を見ます。下がその表です。単位は秒です。

スレッド数threadmultiprocess
122
262
3113
4144
5185
103610

で,Twisted教の教義からマルチスレッドは体に悪いし,Pythonのスレッドはインタープリタをロックしちゃうのでもともとパフォーマンスがよくないと言うことですが,思っていた以上に遅いです。Twistedのようにシングルスレッドで処理する方がよりよいパフォーマンスがえられます(単純に一度のメソッドの実行が2秒とすれば,10回で20秒なので)。

muliprocessingだとcoreが2つあるので,スレッド数(正確にはプロセス数)が2つまでは同じような結果です。その後,スレッド数に応じて速度が遅くなっていますが,正比例に遅くなるだけなので,OSのプロセス管理がちゃんとしているのでしょう。

まとめると,threadよりmultiprocessingの方が圧倒的に速い。
あれ?multiprocessingがどういうものなのか,書いていない。それはまた,いつか。

0 件のコメント: