首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管设置了workers参数,但Scipy的differential_evolution没有在多个核中运行

尽管设置了workers参数,但Scipy的differential_evolution没有在多个核中运行
EN

Stack Overflow用户
提问于 2022-09-07 10:03:06
回答 1查看 51关注 0票数 0

我想使用differential_evolution参数在多个核中运行workers函数。

我遵循了文档的指示,并开发了以下脚本来检查函数的运行时间,无论是否使用了workers参数:

代码语言:javascript
复制
import time

if __name__ == '__main__':
    from scipy.optimize import differential_evolution, rosen
    bounds = [( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 )]

    print( 'Beginning optimisation without parallelisation' )
    start = time.time()
    result = differential_evolution( rosen, bounds,
                                     workers=1,
                                     popsize=200,
                                     maxiter=1000,
                                     tol=0.001,
                                     seed=1 )
    end = time.time()
    print( 'Optimisation finished after {} seconds'.format( round( end - start, 2 ) ) )

    print( '\nBeginning optimisation with workers parameter set to 10' )
    start = time.time()
    result = differential_evolution( rosen, bounds,
                                     updating='deferred',
                                     workers=10,
                                     popsize=200,
                                     maxiter=1000,
                                     tol=0.001,
                                     seed=1 )
    end = time.time()
    print( 'Optimisation finished after {} seconds'.format( round( end - start, 2 ) ) )

运行脚本后,以下是每个调用返回的运行时间:

代码语言:javascript
复制
Beginning optimisation without parallelisation
Optimisation finished after 59.0 seconds

Beginning optimisation with workers parameter set to 10
Optimisation finished after 60.43 seconds

正如您所看到的,将workers参数设置为10的执行速度甚至比第一个要慢。你能帮我做这个吗?为了在differential_evolution函数中实现并行化,还有什么需要做的吗?

我目前正在使用Python3.8,我的scipy版本是1.8.1。

EN

回答 1

Stack Overflow用户

发布于 2022-10-13 02:39:14

@9769953是正确的。multiprocessing引入了一些开销:创建进程,将计算划分到子进程,等等。只有当计算是CPU密集型的,而rosen不需要这种开销,这种开销才能被克服。

如果你的目标函数可以向量化,那么向量化可以提供一个速度增益。如果您可以消除矢量化中的中间计算(这是整个计算中常见的),则收益将更大:

代码语言:javascript
复制
import time
import numpy as np
from scipy.optimize import differential_evolution, rosen

bounds = [( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 ), ( 0, 2 )]


print( 'Beginning optimisation without parallelisation' )
start = time.time()
result = differential_evolution( rosen, bounds,
                                 workers=1,
                                 popsize=200,
                                 updating='deferred',
                                 seed=1 )
end = time.time()
print( f'Optimisation finished after {end - start} seconds')
   
print( '\nBeginning optimisation with vectorisation' )
start = time.time()
result = differential_evolution( rosen, bounds,
                                 updating='deferred',
                                 popsize=200,
                                 seed=1,
                                 vectorized=True
                               )
end = time.time()
print( f'Optimisation finished after {end-start} seconds')

给予:

代码语言:javascript
复制
Beginning optimisation without parallelisation
Optimisation finished after 46.94838500022888 seconds

Beginning optimisation with vectorisation
Optimisation finished after 40.34918713569641 seconds
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73633572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档