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

Paralleling without function is possible?

祝你有愉快的一天!

我有两个函数。首先没有并联:

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

但是没有并行我的脚本 运行ning 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")

你测错时间了。因为你是在函数外测量时间;您在并行调用后测量的时间几乎是整个程序的总 运行 时间。您的 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")

它会告诉你正确的图片

您创建了两个作业(后台进程),然后图书馆为它们提供了 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 倍,并且应该使并行代码比非并行代码更快。