2017-04-26 9 views
0

ためのより遅いです:concurrent.futures.ThreadPoolExecutorは私がconcurrent.futures対リストの内包表記を使用して些細な機能をテストしてるリストの内包

class Test: 

    @staticmethod 
    def something(times = 1): 
     return sum([1 for i in range(times)]) 

    @staticmethod 
    def simulate1(function, N): 
     l = [] 

     for i in range(N): 
      outcome = function() 
      l.append(outcome) 

     return sum(l)/N 

    @staticmethod 
    def simulate2(function, N): 
     import concurrent.futures 

     with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: 
      l = [outcome for outcome in executor.map(lambda x: function(), range(N))] 

     return sum(l)/N 

    @staticmethod 
    def simulate3(function, N): 
     import concurrent.futures 

     l = 0 

     with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: 
      futures = [executor.submit(function) for i in range(N)] 
      for future in concurrent.futures.as_completed(futures): 
       l += future.result() 

     return l/N 

def simulation(): 
    simulationRate = 100000 

    import datetime 

    s = datetime.datetime.now() 
    o = Test.simulate1(lambda : Test.something(10), simulationRate) 
    print((datetime.datetime.now() - s)) 

    s = datetime.datetime.now() 
    o = Test.simulate2(lambda : Test.something(10), simulationRate) 
    print((datetime.datetime.now() - s)) 

    s = datetime.datetime.now() 
    o = Test.simulate3(lambda : Test.something(10), simulationRate) 
    print((datetime.datetime.now() - s)) 

simulation() 

は測定時間、私が取得:

0:00:00.258000 
0:00:10.348000 
0:00:10.556000 

並行処理を開始しているので、スレッドがより速く実行されるのを防ぐボトルネックは何か分かりません。

答えて

0

あなたがこれまであなたのタスク機能を変更した場合、あなたは違いが表示されます:私のMac Proには

def something(n): 
    """ simulate doing some io based task. 
    """ 
    time.sleep(0.001) 
    return sum(1 for i in range(n)) 

を、これは与える:

0:00:13.774700 
0:00:01.591226 
0:00:01.489159 

をconcurrent.futureは、より速く、この明白です時間。

理由は:あなたはPythonのGILのためにCPUベースのタスクをシミュレートしています。concurrent.futureはそれを遅くします。

concurrent.futureは、呼び出し元を非同期に実行するための高水準インタフェースを提供します。間違った場面に使用しています。

+0

私は理解しています、ありがとう! – edoedoedo

関連する問題