python并行计算_并行处理-如何在Python中并行化列表理解计算?

关于列表理解的自动并行化

恕我直言,如果没有其他信息(例如使用OpenMP中的指令提供的信息),或者将其限制为仅包含内置类型/方法的表达式,则无法有效地自动进行列表理解的并行化。

除非能够保证对每个列表项进行的处理没有副作用,否则如果不按顺序进行处理,则结果将无效(或至少不同)。

# Artificial example

counter = 0

def g(x): # func with side-effect

global counter

counter = counter + 1

return x + counter

vals = [g(i) for i in range(100)] # diff result when not done in order

还有任务分配的问题。 问题空间应该如何分解?

如果每个元素的处理形成一个任务(〜任务场),那么当有许多元素各自涉及琐碎的计算时,管理任务的开销将淹没并行化的性能收益。

也可以采用数据分解方法,其中将问题空间平均分配到可用过程中。

列表理解也可以与生成器一起使用的事实使此操作有些棘手,但是,如果可以接受预迭代的开销,那么这可能不是一个成功的选择。 当然,如果后续项目过早迭代,生成器也可能会产生副作用,这些副作用会改变结果。 可能性很小,但可能。

更大的担忧将是跨进程的负载不平衡。 不能保证每个元素都要花费相同的时间来处理,因此静态分区的数据可能导致一个进程完成大部分工作,而使您的时间变得多余。

将列表分解为较小的块,并在每个子进程可用时将其交给是一个不错的折衷,但是,块大小的良好选择将取决于应用程序,因此如果没有用户的更多信息就无法实现。

备择方案

正如在其他几个答案中提到的那样,有多种方法和并行计算模块/框架可以根据一个需求进行选择。

仅使用MPI(用C语言编写),而没有使用Python进行并行处理的经验,因此我无法保证任何内容(尽管快速浏览后,多重处理,水罐,pp和pyro脱颖而出)。

如果要求尽可能地接近列表理解能力,那么水罐似乎是最接近的匹配。 在本教程中,跨多个实例分配任务可以很简单:

from jug.task import Task

from yourmodule import process_data

tasks = [Task(process_data,infile) for infile in glob('*.dat')]

尽管这样做的功能类似于multiprocessing.Pool.map(),但是jug可以使用不同的后端来同步过程并存储中间结果(redis,文件系统,内存中),这意味着这些过程可以跨越集群中的各个节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值