2017-07-19 13 views
0

Python 3.5とPython 2.7の間の一連のプロセスを開始するためのかなりの時間デルタを確認しました。Python3とPython2の間のプロセス開始時間

以下のコードでは、CRITICAL = 8の場合:perfはPy2とPy3ではほとんど同じです(< 1秒)。しかし、9+の場合、Py2のperfは変更されませんが、Py3では深くなります(〜1min!)。

UPDATE

...私が処理するために与える引数のサイズにリンクされているようだ:それはまた、モジュールの場所にリンクされている。実際、「C:\」(または短いパス)から実行される場合、Py3はPy2に似ています。しかし、非常に長いパスから実行すると、Py3のperfは非常にダウングレードされますが、Py2では変わりません。

from __future__ import print_function 
from multiprocessing import Process 
import time 
import itertools 


def workerTask(inputs): 
    for _ in itertools.product(*inputs): 
     pass 


if __name__ == '__main__': 
    CRITICAL = 9 # OK for 8-, KO for 9+ 
    start = time.time() 
    ARGS = [["123.4567{}".format(i) for i in range(CRITICAL)] for _ in range(10)] 
    workerPool = [Process(target=workerTask, args=(ARGS,)) for _ in range(15)] 
    for idx, w in enumerate(workerPool): 
     print("...Starting process #{} after {}".format(idx + 1, time.time() - start)) 
     w.start() 
    print("ALL PROCESSES STARTED in {}!".format(time.time() - start)) 
+2

あなたは、UNIX 'time'コマンドを使用して、同じサンプルコードを実行することができますか?コードを実行して問題を再現できるようにコードを修正できますか? Tx! – amirouche

+1

@Vinceこのスニペットは、この 'self'と欠落しているインポートをすべて実行するためには大変な作業が必要です。 [mcve]を提供してください。そうでないと答えが得られません... –

+0

私は最小限の例をしようとしますが、これを行う前に、python3でこのコードを使ってこのデルタ時間を説明していないものがあるかどうか疑問に思っていました。 – Vince

答えて

1

私は、「マルチプロセス」の作業に非常にモジュラー的に思える選択肢を見つけました。 このようにして、Py3では、Nプロセスを起動する時間はPy2と同じままです。

各プロセスに大きなargsを提供するのではなく、私は共有オブジェクトを作成し、BaseManagerにリンクしています。そこでは、プロセスによって必要とされる膨大なデータが保存されます。 さらに、私は共有進行状況や、各プロセスによって計算されたデータを保存して、それを使い続けて使用することもできます。私はこのソリューションが本当に好きです。ここで

コード:

from __future__ import print_function 
import time 
import itertools 
from multiprocessing import Process 
from multiprocessing.managers import BaseManager 


def workerTask(sharedSandbox): 
    inputs = sharedSandbox.getARGS() 
    for _ in itertools.product(*inputs): 
     pass 


class _SharedData(object): 
    def __init__(self, data): 
     self.__myARGS = data 

    def getARGS(self): 
     return self.__myARGS 


class _GlobalManager(BaseManager): 
    BaseManager.register('SharedData', _SharedData) 


if __name__ == '__main__': 
    CRITICAL = 9 # OK for 8-, KO for 9+ 
    start = time.time() 
    manager = _GlobalManager() 
    manager.start() 
    ARGS = manager.SharedData([["123.4567{}".format(i) for i in range(CRITICAL)] for _ in range(10)]) 
    workerPool = [Process(target=workerTask, args=(ARGS,)) for _ in range(15)] 
    for idx, w in enumerate(workerPool): 
     print("...Starting process #{} after {}".format(idx + 1, time.time() - start)) 
     w.start() 
    print("ALL PROCESSES STARTED in {}!".format(time.time() - start)) 
    while any([w.is_alive() for w in workerPool]): 
     pass 
関連する問題