Python Language
並列計算
サーチ…
備考
GIL(グローバルインタプリタロック)のため、Pythonインタプリタの1つのインスタンスだけが1つのプロセスで実行されます。一般的に、マルチスレッドを使用すると、CPUにバインドされたものではなく、IOバウンドの計算が向上します。 CPUに束縛されたタスクを並列化する場合は、 multiprocessing
モジュールをお勧めします。
GILはPythonの最も一般的な実装であるCPythonとPyPyに適用されます。 JythonやIronPythonなどの他の実装では、GILはありません 。
マルチプロセッシング・モジュールを使用したタスクの並列化
import multiprocessing
def fib(n):
"""computing the Fibonacci in an inefficient way
was chosen to slow down the CPU."""
if n <= 2:
return 1
else:
return fib(n-1)+fib(n-2)
p = multiprocessing.Pool()
print(p.map(fib,[38,37,36,35,34,33]))
# Out: [39088169, 24157817, 14930352, 9227465, 5702887, 3524578]
fib
への各呼び出しの実行が並行して行われるので、完全な例の実行時間は、デュアルプロセッサ上でシーケンシャルな方法で実行された場合よりも1.8倍高速です。
Python 2.2以降
親スクリプトと子スクリプトを使用して並列にコードを実行する
child.py
import time
def main():
print "starting work"
time.sleep(1)
print "work work work work work"
time.sleep(1)
print "done working"
if __name__ == '__main__':
main()
parent.py
import os
def main():
for i in range(5):
os.system("python child.py &")
if __name__ == '__main__':
main()
これは、パラレルで独立したHTTP要求/応答タスクまたはデータベースの選択/挿入に役立ちます。コマンドライン引数はchild.pyスクリプトにも与えられます。スクリプト間の同期は、すべてのスクリプトが定期的に別のサーバー(Redisインスタンスなど)をチェックすることで実現できます。
C-エクステンションを使用してタスクを並列化する
ここでの考え方は、計算集約型のジョブをPythonとは独立したC(特別なマクロを使用)に移動し、CコードをGILが動作している間に解放することです。
#include "Python.h"
...
PyObject *pyfunc(PyObject *self, PyObject *args) {
...
Py_BEGIN_ALLOW_THREADS
// Threaded C code
...
Py_END_ALLOW_THREADS
...
}
PyParモジュールを使用して並列化する
PyParはPythonで並列処理を提供するためにメッセージパッシングインターフェイス(MPI)を使用するライブラリです。 PyParの簡単な例( https://github.com/daleroberts/pyparに見られる)は次のようになります:
import pypar as pp
ncpus = pp.size()
rank = pp.rank()
node = pp.get_processor_name()
print 'I am rank %d of %d on node %s' % (rank, ncpus, node)
if rank == 0:
msh = 'P0'
pp.send(msg, destination=1)
msg = pp.receive(source=rank-1)
print 'Processor 0 received message "%s" from rank %d' % (msg, rank-1)
else:
source = rank-1
destination = (rank+1) % ncpus
msg = pp.receive(source)
msg = msg + 'P' + str(rank)
pypar.send(msg, destination)
pp.finalize()
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow