2017-07-19 57 views
0

我觀察到啓動Python 3.5和Python 2.7之間的一系列進程的顯着時間增量。Python3和Python2之間的進程啓動持續時間

在下面的代碼中,如果CRITICAL = 8:perf在Py2和Py3中幾乎相同(< 1s)。但是對於9+,Py2中的perf保持不變,而在Py3中則是最差的(〜1min!)。

它似乎掛成參數我給要處理的大小...

UPDATE:它也與模塊的位置。事實上,如果它從「C:\」(或短路徑)運行,那麼Py3與Py2類似。但是,如果從很長的路徑運行,Py3中的perf會降級,而Py2中的perf會保持不變。

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解釋這個delta時間相同的代碼。 – Vince

回答

1

我發現了一種替代方案,它似乎對「多進程」工作非常模塊化。 通過這種方式,在Py3中,啓動N進程的時間與Py2類似。

我沒有爲每個進程提供巨大的參數,而是創建一個鏈接到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