【问题标题】:Paralleling without function is possible?可以无功能并联吗?
【发布时间】:2016-03-07 09:49:20
【问题描述】:

祝你有美好的一天!

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      它会告诉你正确的图片

      【讨论】:

        猜你喜欢
        • 2012-05-08
        • 2010-12-25
        • 1970-01-01
        • 2013-12-20
        • 2019-04-24
        • 2014-06-06
        • 2011-07-09
        • 2013-03-17
        • 1970-01-01
        相关资源
        最近更新 更多