度过美好的一天!
我有两个功能。首先没有平行:
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 :(得分: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 :(得分:-1)
你正在测量错误的时间。因为你正在测量功能之外的时间;您在并行呼叫后测量的时间是几乎整个程序的总运行时间。你的start_time与函数调用无关。
在您的功能中,您在每个功能开始之前测量了startTime。但那没关系。如果不平行地调用该函数,则不会花费上面定义的开始时间。
该程序将计算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")
它会显示正确的图片