0

有一個愉快的一天!並聯無功能是可能的嗎?

我有兩個功能。首先沒有並聯:

def non_parallel(): 
for a in range(500): 
    for b in range(500): 
     for c in range(500): 
      try: 
       if (1+1/a)*(1+1/b)*(1+1/c)==3: 
        print("a=",a,", b=",b,", c=", c, sep='') 
      except ZeroDivisionError: 
       pass 
print ("Run time: ", datetime.now() - startTime) 

二是並聯:

def parallel(a): 
for b in range(500): 
    for c in range(500): 
     try: 
      if (1+1/a)*(1+1/b)*(1+1/c)==3: 
       print("a=",a,", b=",b,", c=", c, sep='') 
     except ZeroDivisionError: 
      pass 

呼叫並聯功能(我有2個內核):

Parallel(n_jobs=num_cores)(delayed(parallel)(a) for a in range(500)) 

但是,如果沒有並聯我的腳本運行0:02:03.972283 並聯功能:02:45.182950

我認爲,並聯函數運行時間更長,因爲函數調用需要更多時間。這是真的?是否可以並行其他方式?

全碼:

#!/usr/bin/python3 
from datetime import datetime 
from joblib import Parallel, delayed 
import multiprocessing 
num_cores = multiprocessing.cpu_count() 
print (num_cores) 

startTime = datetime.now() 
def non_parallel(): 
    for a in range(500): 
     for b in range(500): 
      for c in range(500): 
       try: 
        if (1+1/a)*(1+1/b)*(1+1/c)==3: 
         print("a=",a,", b=",b,", c=", c, sep='') 
       except ZeroDivisionError: 
        pass 
    print ("Time: ", datetime.now() - startTime) 

startTime = datetime.now() 
def parallel(a): 
    for b in range(500): 
     for c in range(500): 
      try: 
       if (1+1/a)*(1+1/b)*(1+1/c)==3: 
        print("a=",a,", b=",b,", c=", c, sep='') 
      except ZeroDivisionError: 
       pass 
non_parallel() 
Parallel(n_jobs=num_cores)(delayed(parallel)(a) for a in range(500)) 
print ("Time: ", datetime.now() - startTime) 
print ("End") 

回答

0

創建兩個作業(後臺進程),然後該庫進他們的工作做500次。這將涉及很多工作。

嘗試:

def parallel(astart): 
    for a in range (astart, astart+10): 
     for b in range(500): 
      for c in range(500): 
       try: 
        if (1+1/a)*(1+1/b)*(1+1/c)==3: 
         print("a=",a ,", b=",b,", c=", c, sep='') 
       except ZeroDivisionError: 
        pass 

Parallel(n_jobs=num_cores)(delayed(parallel)(a) for a in range(0,500,10)) 

將由10倍減少的進程間通信,並應使並行代碼比非平行更快。

-1

您進行計時錯誤。因爲你正在測量功能以外的時間;並行調用之後通過您所測量的時間幾乎是整個程序的總運行時間。你的start_time與函數調用無關。

在你的函數中,你測量了每個函數開始之前的startTime。但那並不重要。當你沒有平行調用函數時,它不會在上面定義開始時間。

程序會計算兩次startTime。最新的功能不需要並聯,您可以從startTime到函數調用結束的時間。並機功能,不過開始時間仍然是相同的,你會得到非平行+平行

的運行時修改程序這樣

non_parallel() 
startTime = datetime.now() 
Parallel(n_jobs=num_cores)(delayed(parallel)(a) for a in range(500)) 
print ("Time: ", datetime.now() - startTime) 
print ("End") 

它會告訴你正確的畫面