没有功能的并联是可能的吗?
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 倍,并且应该使并行代码比非并行代码更快。
祝你有愉快的一天!
我有两个函数。首先没有并联:
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 倍,并且应该使并行代码比非并行代码更快。