python windows和linux速度_python – 多处理比Windows中的串行处理慢(但不是在Linux中)...

我正在尝试并行化for循环以加速我的代码,因为循环处理操作都是独立的.在线教程之后,似乎Python中的标准多处理库是一个良好的开端,我已经将其用于基本示例.

但是,对于我的实际用例,我发现在Windows上运行时,并行处理(使用双核机器)实际上有点(<5%)较慢.但是,与串行执行相比,在Linux上运行相同的代码可以使并行处理速度提高约25%.

从文档中,我认为这可能与Window缺少fork()函数有关,这意味着每次都需要初始化该过程.但是,我不完全理解这一点,并想知道是否有人可以确认这一点?

尤其,

– &GT这是否意味着调用python文件中的所有代码都会在Windows上为每个并行进程运行,甚至是初始化类和导入包?

– &GT如果是这样,可以通过某种方式将类的副本(例如使用deepcopy)传递到新进程中来避免这种情况吗?

– &GT是否有任何提示/其他策略可以有效地并行化unix和windows的代码设计.

我的确切代码很长并且使用了很多文件,所以我创建了一个pseucode风格的示例结构,希望能够显示问题.

# Imports

from my_package import MyClass

imports many other packages / functions

# Initialization (instantiate class and call slow functions that get it ready for processing)

my_class = Class()

my_class.set_up(input1=1, input2=2)

# Define main processing function to be used in loop

def calculation(_input_data):

# Perform some functions on _input_data

......

# Call method of instantiate class to act on data

return my_class.class_func(_input_data)

input_data = np.linspace(0, 1, 50)

output_data = np.zeros_like(input_data)

# For Loop (SERIAL implementation)

for i, x in enumerate(input_data):

output_data[i] = calculation(x)

# PARALLEL implementation (this doesn't work well!)

with multiprocessing.Pool(processes=4) as pool:

results = pool.map_async(calculation, input_data)

results.wait()

output_data = results.get()

编辑:我不相信这个问题与建议的问题重复,因为这与Windows和Linunx的差异有关,在建议的重复问题中根本没有提到.

解决方法:

NT操作系统缺少UNIX fork原语.创建新进程时,它将作为空白进程启动.父母负责指导新流程如何引导.

Python多处理API抽象了创建进程,试图给fork,forkserver和spawn start方法带来同样的感觉.

当你使用spawn启动方法时,这就是引擎盖下发生的事情.

>创建一个空白流程

>空白流程启动了一个全新的Python解释器

> Python解释器被赋予您通过Process类初始化程序指定的MFA(模块函数参数)

> Python解释器加载解析所有导入的给定模块

>在模块中查找目标函数,并使用给定的args和kwargs调用

上述流程带来的影响很小.

正如你所注意到的那样,与fork相比,这是一个更加繁重的操作.这就是你注意到性能差异的原因.

在子进程中从头开始导入模块时,将重新执行所有导入副作用.这意味着将再次执行常量,global variables,decorators和第一级指令.

另一方面,在父进程执行期间进行的初始化不会传播给子进程.见this例子.

这就是为什么在多处理文档中他们在Programming Guidelines中为Windows添加了一个特定的段落.我强烈建议阅读编程指南,因为它们已经包含了编写便携式多处理代码所需的所有信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值