multiprocessingの時間計測

Intel Core2 Duo CPUマシンでmultiprocessingモジュールを使用した場合としない場合の実行時間を比較した。Pythonは3.0を使用。2.6でもOK。

from multiprocessing import Process
import time

def fib_n_times(cnt):
    for i in range(1, cnt+1):
        print('%d => %d' % (i, fib(i)))

def fib(n): 
    if n == 0 or n == 1: 
        return n 
    else: 
        return fib(n-1) + fib(n-2)

def multi(nfib, ntimes=2):
    t = time.time()
    ps = []
    for i in range(ntimes):
        p = Process(target=fib_n_times, args=(nfib,))
        p.start()
        ps.append(p)
    for i in range(ntimes):
        ps[i].join()
    return time.time() - t

def non_multi(nfib, ntimes=2):
    t = time.time()
    for i in range(ntimes):
        fib_n_times(nfib)
    return time.time() - t
    
if __name__ == '__main__':
    nfib = 34
    t1 = non_multi(nfib)
    t2 = multi(nfib)
    print('non multiprocessing: %.3f sec' % t1)  # 27.454 sec
    print('multiprocessing:     %.3f sec' % t2)  # 14.562 sec

multiprocessingを使用しない場合は約27秒かかり、使用した場合は約14秒だった。タスクマネージャを見ていると、使用しない場合はCPUの使用率が50%〜60%くらいだったが、使用した場合はCPUの使用率がほぼ100%だった。


multiprocessingを使用しても所詮はPythonなので遅い。Cythonなどを使用してC言語の方でマルチコアに対応できる必要があると思うが、どうすれば良いのだろう?Cythonが生成したCコードをIntel C++ Compilerとかでコンパイルすればできるのかな?


使用したことながったが、これでParallel Pythonは不要になると思う。