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は不要になると思う。
- Parallel Python (http://www.parallelpython.com/)
- multiprocessing- Process-based "threading" interface (http://docs.python.org/dev/library/multiprocessing.html#module-multiprocessing)