2017-06-07 11 views
1

私は、プロセッサーインテル®Core™i7-7500U CPU @ 2.70GHz×4と16GBのRAMを搭載した64ビットUbuntu 17.04を使用しています。
このプログラムを実行すると、4つのコアすべてを使用する代わりに、1つのコアが使用されます。私は各機能10のいくつかの低電力を印刷する場合なぜPythonがマルチプロセッシングでいくつかの計算を事前に計算しようとしている

import time 
import multiprocessing 

def boom1(*args): 
    print(5**10000000000) 

def boom2(*args): 
    print(5**10000000000) 

def boom3(*args): 
    print(5**10000000000) 

def boom4(*args): 
    print(5**10000000000) 

if __name__=="__main__": 
    array = [] 
    p1 = multiprocessing.Process(target=boom1, args=(array,)) 
    p2 = multiprocessing.Process(target=boom2, args=(array,)) 
    p3 = multiprocessing.Process(target=boom3, args=(array,)) 
    p4 = multiprocessing.Process(target=boom4, args=(array,)) 

    p1.start() 
    p2.start() 
    p3.start() 
    p4.start() 


    p1.join() 
    p2.join() 
    p3.join() 
    p4.join() 

    print('Done') 

今:

print(5 ** 10000000) 

今時間の小さな期間にわたって、単一のコア100%を処理して、その後、すべての4つのコアが100%を実行しています。 これはなぜそうですか? 100%稼働のすべてのコアで始めるべきではありません。

私が知りたかったのは、Pythonがそれ自体の前にいくつかの操作を実行し、それゆえに単一のコアからそれをやっていたことでした。それがそうであれば、Pythonの解釈ポイントは何ですか?または何かが欠けていますか?

答えて

1

peepholeオプティマイザは、5**10000000000計算を定式化しようとしています。これは、ワーカープロセスが起動する前に発生します。

1

ほとんどの言語では定数の折りたたみの最適化があります。定数間の演算が現れると、コンパイラは演算を実行し、式を単一定数の結果で置き換えます。

これもPythonが行います。あなたのマルチノード操作は、単に各ノードのstart-print-joinのシーケンスであると思います。

4ノードで実行時間を長くしたい場合は、解析時に評価できない式を試してください。たとえば、引数リストに基数を渡して5の代わりにそれを使用するか、あるいは各プロセスに1-10の範囲の乱数を与えて、それを指数に加えるようにします。これにより、実行時の評価が強制されます。

0

以前の回答は正しいと思いますが、あなたの意見を完全には説明できないことがあります。他の人が指摘しているように、あなたが見ているシングルプロセッサ時間は、指数表現の値を計算するためにインタープリタが費やしている時間です。あなたは整数を使用しているので、Pythonは任意に長い整数を扱うことができます。これはかなり時間がかかります。おそらく指数部の0の数が指数関数的になります。最初のケースでは、計算時間がかかりすぎて、それを過ぎていないように見えます(完了したかどうか、メモリが足りなくてもマシンが実行できるかどうかわかりません)。

2番目のケースでは、それを計算できるように十分な数のゼロを削除してから(シングルスレッドインタープリタ)、それを(並行して)印刷します。しかし、それが長くかかっても、最初の場合にはおそらく少なくとも1000倍長くかかるでしょう。

関連する問題