没有功能的并联是可能的吗?

时间:2016-03-07 09:49:21

标签: python python-3.x parallel-processing python-multiprocessing

度过美好的一天!

我有两个功能。首先没有平行:

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")

2 个答案:

答案 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")

它会显示正确的图片