Parallel,delayed用法

Parallel,delayed用法fromjoblib parallelimpo delayed 一般用法 Joblib 提供了一个简单的帮助类来编写并行化的循环 其核心思想是把代码写成生成器表达式的样子 然会再将它转换为并行计算 frommathimpo sqrt i2 foriinrange 10 使用以下方式 可将计算分布到两个 CPU 上 frommathimpo delayedPar

from joblib.parallel import Parallel,delayed 

一般用法

Joblib提供了一个简单的帮助类来编写并行化的循环。其核心思想是把代码写成生成器表达式的样子,然会再将它转换为并行计算:

from math import sqrt [sqrt(i 2) for i in range(10)] 

使用以下方式,可将计算分布到两个CPU上:

from math import sqrt from joblib import Parallel, delayed Parallel(n_jobs=2)(delayed(sqrt)(i 2) for i in range(10)) 

以上,Parallel对象会创建一个进程池,以便在多进程中执行每一个列表项。函数delayed是一个创建元组(function, args, kwargs)的简单技巧。

使用多线程

默认情况下,Parallel使用Python的多进程模块(multiprocessing)来fork工作进程,以便任务可以在独立的CPU上同时执行。这对于一般的Python程序来说是合理的,但这会产生一些开销,即,输入输出数据需要被序列化到一个排队,才能在工作进程之间进行通信。

当然,如果你知道,你调用的函数是基于编译扩展的,且它在执行的大部分时间都会释放Python的全局解释器锁(GIL),那么此时使用多线程可能会更高效。

为了使用多线程,只需在构造Parallel的时候设置backend=’threading’即可:

Parallel(n_jobs=2, backend="threading")( ... delayed(sqrt)(i 2) for i in range(10)) 

在共享内存(memmaping)中操作数值型数据

默认情况下,当n_jobs != 1时,joblib使用Python标准库的多进程模块(multiprocessing)来创建真实的Python工作进程 。传递给Parallel调用的参数被序列化,并且会在每一个工作进程中重新创建。

这对于大型参数会成为一个问题,因为它们会被工作进程创建n_jobs次。

这在使用numpy进行科学计算中经常发生。joblib.Parallel对大型数组提供了一个特别的处理方法就是自动dump它们到文件系统,并将引用传递给工作进程,然后让工作进程使用numpy.ndarray的子类numpy.memmap以内存映射的方式打开它们 。这使得所有工作进程可以共享一段数据(更准确的说是共享一段内存)。

自动将array转换为memmap

通过在数组的大小上配置一个阀值自动触发将array转换为memmap:

import numpy as np from joblib import Parallel, delayed from joblib.pool import has_shareable_memory Parallel(n_jobs=2, max_nbytes=1e6)( ... delayed(has_shareable_memory)(np.ones(int(i))) ... for i in [1e2, 1e4, 1e6]) 

默认情况下,数据被dump到/dev/shm共享内存分区,如果它存在且可写 (在Linux上就是这样的)。否则将使用操作系统的临时文件夹。可以通过设置Parallel构造函数的参数temp_folder来自定义临时数据文件的位置 。

设置max_nbytes=None可禁用自动转换。

手动映射输入数据

为了更好地使用内存,你可以手动将数组dump成memmap,然后在fork工作进程之前从父进程中删除原数组。

让我们在父进程中创建一个大型数组:

large_array = np.ones(int(1e6)) 

然后,将它dump到本地文件,以便内存映射:

import tempfile import os from joblib import load, dump temp_folder = tempfile.mkdtemp() filename = os.path.join(temp_folder, 'joblib_test.mmap') if os.path.exists(filename): os.unlink(filename) _ = dump(large_array, filename) large_memmap = load(filename, mmap_mode='r+') 

此时,变量large_memmap指向一个numpy.memmap实例:

>>> large_memmap.__class__.__name__, large_array.nbytes, large_array.shape >('memmap', , (,)) >>> np.allclose(large_array, large_memmap) >True 

然后,我们就可以释放原来的数组了:

del large_array import gc _ = gc.collect() 

large_memmap还可以被切片成小的memmap:

>>> small_memmap = large_memmap[2:5] >>> small_memmap.__class__.__name__, small_memmap.nbytes, small_memmap.shape > ('memmap', 24, (3,)) 

最后,对np.ndarray视图的修改会被写回原来的内存映射文件:

>>> small_array = np.asarray(small_memmap) >>>> small_array.__class__.__name__, small_array.nbytes, small_array.shape >('ndarray', 24, (3,)) 

所有这三个结构都指向相同的内存区域,且这段内存能够被工作进程直接使用:

>>> Parallel(n_jobs=2, max_nbytes=None)( ... delayed(has_shareable_memory)(a) ... for a in [large_memmap, small_memmap, small_array]) >[True, True, True] 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233017.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 通用代码高亮插件(SyntaxHighlighter)

    通用代码高亮插件(SyntaxHighlighter)写这篇博文的起源是我想把自己的博客弄的更加美观,相信你也一样。        首先,我要说SyntaxHighlighter插件的实现方式及应用示例,然后再说明如何将其应用到自己的博客,使博客的代码着色更加美观。 源码: SyntaxHighlighter 示例源码下载SyntaxHighlighterSyntaxHighlighter源码下载1)        Sy…

    2025年6月17日
    2
  • ECharts介绍及使用方法

    ECharts介绍及使用方法前面做项目时用到ECharts,今天特此整理一下,作为笔记,同时希望帮助更多人。首先简单介绍一下,ECharts是一个纯JavaScript图表库,底层依赖于轻量级的Canvas类库ZRender,基于BSD开原协议,是一款非常优秀的可视化前端框架。官网地址:http://echarts.baidu.com/1.首先在官网选择合适的下载版本http://echart…

    2022年6月12日
    43
  • R-L模型算法的优缺点_审计重要性特征

    R-L模型算法的优缺点_审计重要性特征1.特征重要性的意义LR模型也就是逻辑回归模型,作为一个简单的常用的模型,其有非常多的有点,除了模型简单,容易实现分布式,还有一个重要的优点就是模型的可解释性非常好。因为每个特征都对应一个模型参数wiw_{i}wi​,该参数越大,那么该特征对模型预测结果的影响就会越大,我们就说该特征就越重要,因此LR模型的特征重要性评估方式就是wiw_{i}wi​的大小。2.逻辑回归模型特征重要性及排序Ta…

    2022年10月8日
    3
  • JAVA中SQL查询语句大全,select多表查询,各种查询

    JAVA中SQL查询语句大全,select多表查询,各种查询以员工表:emp为例idnamegenderbirthdaydeptjobsalbonus编号姓名性别生日部门职位薪资奖金基本查询–查询emp表中的所有员工信息select*fromemp;–查询emp表中的所有员工的姓名、薪资、奖金selectname,sal,bonusfromemp;–查询emp表中…

    2022年5月31日
    107
  • Pycharm的python interpreter选择「建议收藏」

    Pycharm的python interpreter选择「建议收藏」初学python时我在电脑装idle,装上了ANACONDA,也裸装了python3.9(也就是说我电脑上有两个独立的python,一个是python3.9,另一个是装在Anaconda里面的python3.7。在我装上Pycharm后,Pycharm自动使用Anaconda提供的环境,虽然Anaconda的包很全,但还是有缺少的包,当我使用pip命令安装需要的包时,确自动安装到了python3.9的安装目录下,而且命令行运行python时只运行python3.9而不是Anaconda里面的python

    2022年8月27日
    5
  • 一气之下,我一行代码搞定了约瑟夫环问题,面试官懵了[通俗易懂]

    一气之下,我一行代码搞定了约瑟夫环问题,面试官懵了[通俗易懂]大家好,我是帅地。对于约瑟夫环问题估计大家都听说过,除非你刚刚读大一,因为在大一大部分学校的课本都会降到这个算法题。为了以防万一你没听过,我还是给下问题的描述问题描述:编号为1-N的N个士兵围坐在一起形成一个圆圈,从编号为1的士兵开始依次报数(1,2,3…这样依次报),数到m的士兵会被杀死出列,之后的士兵再从1开始报数。直到最后剩下一士兵,求这个士兵的编号。记得有一次,貌似是阿里的面试,面试官给了我一到原汁原味的约瑟夫好,好家伙,看我不把你秀一把。不过,作为一个有着几十场面

    2022年6月4日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号