0

私は画像処理のpython関数を作成しています。Pythonスクリプトは、マルチプロセスを使用してゆっくりです

私のシステムには4コア+4スレッドがあります。

私は自分の機能をスピードアップするためにマルチプロセッシングを使いたいと思っていますが、いつでもマルチプロセッシングパッケージを使うことができます。私の機能はそれほど速くなく、1分ほど遅いです。なぜ最初にマルチプロセッシングパッケージを使用するのか考えてください。

主な機能:

if __name__ == '__main__': 
    in_path="C:/Users/username/Desktop/in.tif" 
    out_path="C:/Users/username/Desktop/out.tif" 
    myfun(in_path, out_path) 

時間= 3.4分マルチ地図

if __name__ == '__main__': 
    p = Pool(processes=4) 
    in_path="C:/Users/username/Desktop/in.tif" 
    out_path="C:/Users/username/Desktop/out.tif" 
    result = p.map(myfun(in_path,out_path)) 

時間= 4.4分

if __name__ == '__main__': 
    pool = multiprocessing.Pool(4) 
    in_path="C:/Users/username/Desktop/in.tif" 
    out_path="C:/Users/username/Desktop/out.tif" 
    pool.apply_async(myfun, args=(in_path,out_path,)) 
    pool.close() 
    pool.join() 

時間= 4.5分

+0

問題は 'myfun()'にありますので、私たちには表示されません。 –

+0

@JohnZwinckなので、マルチプロセッシングは特定の機能専用ですか? – user27818

+0

コードを表示して決定してみませんか? –

答えて

0

サブプロセスで同じパラメータを使用して同じ機能を実行しています。これは最低でも新しいプロセスを作成するためのシステムオーバーヘッドがあり、Pythonの自分のオーバーヘッド。まったく新しいインタプリタ、スタック、GILを作成します。それには時間がかかります。

POSIXシステムでは、このオーバーヘッドは、フォークおよびコピーオンライトメモリを使用できるため、少し高速ですが、Windowsでは、これは基本的にはコマンドラインからpython -c "from your_script import myfun; myfun('C:/Users/username/Desktop/in.tif', 'C:/Users/username/Desktop/out.tif')"を呼び出した場合とかなりの時間がかかります。

機能から並列化できるかなりの計算要件がある場合にのみ、マルチプロセッシングの利点に気付くでしょう。 this answerの簡単なベンチマークを確認してください。

+0

私はその例を簡単に見せてくれますか? – user27818

+0

私はこれをあなたの提案をもう一度使っていれば – user27818

+0

@ user27818 - 例を示すことではなく、別のプロセスとしてあなたの関数を実行するのになぜ時間がかかるのか説明しました。一度に複数のプロセスを実行する必要があるマルチプロセッシングの利点を得るには、常にそういうことになります(できるだけ多くのプロセスが、処理に利用できるCPUコアの数に一致することが望ましい)。私が与えた他の答えへのリンクは、 'multiprocessing.Pool.map()'によって明示的に示されています。 – zwer

1

multiprocessing.Pool.map()は、自動的に機能を並行して実行するわけではありません。したがって、Pool.map(my_function(single_input))を実行しても、それはより速く実行されません。実際、それはそれを遅くするかもしれません。

map()の目的は、あなたが複数の入力を持っている場合は、並行して同じ機能複数回を実行できるようにすることです。あなたが持っていた場合

:あなたは、単一の入力を持っているのでしかし、あなただけを実行する必要が

p = Pool(4) 
results = p.map(my_function, zip(in_paths, out_paths)) 

を:

in_paths = ['C:/Users/in1.tif', 'C:/Users/in2.tif', ... ] 
out_paths = ['C:/Users/out1.tif', 'C:/Users/out2.tif', ... ] 

は、その後、例えば、あなたのプログラムをスピードアップするためにPool.map()を使用することができます一度機能するので違いはありません。お役に立てれば。

関連する問題