Python高效计算库Joblib的详细入门教程

文章目录

  • 1. Joblib库是什么?
  • 2. 核心功能介绍及演示
    • 2.1 高效序列化和反序列化对象
    • 2.2 快速磁盘缓存
    • 2.3 并行计算


1. Joblib库是什么?

Joblib 是一个用于在 Python 中进行高效计算的开源库,提供了一些用于内存映射和并行计算的工具,能大幅提高科学计算和数据分析的效率,特别适合于需要进行重复计算或大规模数据处理的任务。

Joblib 库的常用关键功能包括对象高效序列化、函数值临时缓存以及并行计算,能够优化数据处理流程。在Python中安装 Joblib 库也非常简单,通过 pip 执行以下命令即可:

pip install joblib

安装完成后,执行如下代码,如果能输出相应版本号,则说明已经成功安装。

import joblib
print(joblib.__version__)

2. 核心功能介绍及演示

joblib 库的主要功能体现在以下三方面:

  1. 高效序列化和反序列化:除特殊Python对象外,Joblib 库能将数值对象高效序列化保存到本地,常常用来保存、加载数据对象和模型对象;
  2. 快速磁盘缓存:够提供高效的磁盘缓存和延迟加载,可以将函数的返回值缓存到磁盘上以避免重复计算;
  3. 并行计算:能轻松将代码任务分配到多核处理器上。

2.1 高效序列化和反序列化对象

类似于 pickle 库,Joblib 库提供了 dumpload 函数,能够高效地将大型数据对象(例如大型数组、机器学习模型等)保存到本地文件或从本地文件加载回来。Joblib 针对 numpy 数组进行了特定的优化,基于殊序列化格式,相比于通用的序列化更加高效。

如下例子,对比了 pickle 库和 Joblib 库在保存和加载大规模数组上的效率。首先生成 ( 10000 , 10000 ) (10000,10000) (10000,10000) 的数组,两个库分别循环保存和加载数据 5 5 5 次,最终的平均处理时间如下(见注释部分):

import numpy as np
import pickle, joblib, time# 生成一个大型的 numpy 数组对象,例如 10000 x 10000 的数组
large_array = np.random.rand(10000, 10000)# 循环5次
n = 5# 平均处理时间 2.54s
for i in range(n):with open(f'pickle_data_{i}.pkl', 'wb') as f:pickle.dump(large_array, f)# 平均处理时间 0.72s
for i in range(n):with open(f'pickle_data_{i}.pkl', 'rb') as f:load_large_array = pickle.load(f)# 平均处理时间 2.16s
for i in range(n):joblib.dump(large_array, f'joblib_data_{i}.joblib')# 平均处理时间 0.04s
for i in range(n):load2_large_array = joblib.load(f'joblib_data_{i}.joblib')

相比于 pickle 库加载 .pkl 文件,Joblib 库加载 .joblib 文件的平均效率极高,保存文件的效率也有一定的优势,此外,Joblib 库的接口更加易用,因此在处理含大量数据的任务时常常用来代替 pickle 库。

这种保存再加载的方式,常用在将训练好的模型或计算的数据集保存后分发给其他用户,还常常用于大规模数据的深拷贝(相比于直接深拷贝,保存后加载的方式常常更快)等场景中。

2.2 快速磁盘缓存

Joblib 库的另一核心功能是能将函数的计算返回值快速缓存到磁盘上(记忆模式),当再次调用该函数时,如果函数的输入参数没有改变,则 Joblib 直接从缓存中加载结果而不是重新计算。

如下例子,通过定义缓存目录,以及创建缓存器,添加指定装饰器后,当我们运行第一次函数时,会将函数计算结果缓存到磁盘,再次调用函数时,如果输入参数相同,则从磁盘调出相应的计算结果,避免重复计算。当然了,很自然的一个想法是,为什么不把函数的计算结果保存为哈希表,传入参数为键,计算结果为值,当然也是可行的,但这会极大占用内存,而 Joblib 是将原本应在内存上的计算结果缓存到磁盘,且缓存和调用的处理非常快。

from joblib import Memory
import timecachedir = './my_cache'  # 定义缓存目录
memory = Memory(cachedir, verbose=0)@memory.cache
def expensive_computation(a, b):print("Computing expensive_computation...")sum_ = 0for i in range(1000000):sum_ += a * b / 10 + a / breturn sum_# 第一次调用,将计算并缓存结果
result = expensive_computation(20, 3)
# 0.0967 s# 第二次调用,将直接从缓存加载结果
result = expensive_computation(20, 3)
# 0.000997 s

上述代码的装饰器可以理解为将函数 expensive_computation 作为参数传入 memory.cache() 方法当中,上述写法等价于 memory.cache(expensive_computation())

显然,对于有大量重复计算的任务,该库能极大地提高处理效率。值得注意的是,上述定义的函数中,存在打印语句 print(...),当首次执行函数时,会执行该打印语句,而函数是重复执行的,则会直接从缓存中继承曾经的计算结果,而不会经过中间具体的计算逻辑,也就不会打印相关语句。

2.3 并行计算

Joblib 的最核心的功能应该是提供了高级的(简单易用)并行化工具,能够使我们轻松地将计算任务分配到多个 CPU 核心上执行。

如下所示,当我们有多个独立的任务需要执行,可以通过 Joblib 的 Paralleldelayed 功能并行处理这些任务,从而节省时间。

from joblib import Parallel, delayed
import numpy as npdef process(i):data = np.random.rand(1000, 1000)# 普通的循环计算
# 5.798 s
for i in range(1000):process(i)# Joblib 的并行计算
# 3.237 s
Parallel(n_jobs=4)(delayed(process)(i) for i in range(1000))

上述式子在,n_jobs 定义了线程数,若n_jobs=-1,则启用所有可用的 CPU 核心;delayed() 中传入任务(函数)名,而后的 (i) 为任务分配传入参数,在 Joblib 的并行计算下,执行 1000 1000 1000 次任务 process() 的时间为 3.237 s 3.237s 3.237s,而循环依次执行的时间为 5.798 s 5.798s 5.798s

随着任务的计算复杂度增大、独立任务数增多,并行计算的优势会逐渐明显,但相对于我们开的并行任务数,这种优势有时并不那么显著。原因在于,默认情况下,joblib.Parallel 是启动单独的Python工作进程,以便在分散的CPU上同时执行任务,但由于输入和输出数据需要在队列中序列化以便同工作进程进行通信,可能会导致大量开销。因此,小规模任务下,Joblib 的并行计算效率可能较低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图分类之Hierarchical Graph Differentiable Pooling (下)

作者代码链接 https://github.com/RexYing/diffpool 1. paper中介绍的图池化机制 SoftPoolingGcnEncoder 是为图结构数据设计的神经网络模型。它通过结合分层池机制扩展了传统图卷积网络(GCN)的功能。这种池化机制通过逐步减少节点数量,同…

【Mongodb】Mongodb亿级数据性能测试和压测

一,mongodb数据性能测试 如需转载,请标明出处:https://zhenghuisheng.blog.csdn.net/article/details/139505973 mongodb数据性能测试 一,mongodb数据性能测试1,mongodb数据库创建和索引设置2,线程池批量…

React+TS前台项目实战(一)-- 项目初始化配置及开此系列的初衷

文章目录 前言一、初始化项目二、基础配置1. 项目目录及说明如下2. TS版本使用Craco需注意 总结 前言 前面 后台管理系统实战 系列教程暂时告一段落了,想了解全局各种配置的可自行查看。本次教程将重点介绍React前台项目的实操,关于具体的配置&#xff…

龙迅LT8712X TYPE-C或者DP转HDMI加VGA输出,内置MCU,只是IIS以及4K60HZ分辨率

龙迅LT8712X描述: LT8712X是一种高性能的Type-C/DP1.2到HDMI2.0和VGA转换器,设计用于将USB Type-C源或DP1.2源连接到HDMI2.0和VGA接收器。LT8712X集成了一个DP1.2兼容的接收器,一个HDMI2.0兼容的发射机和一个高速三角机窝视频DAC。此外&…

Python 可变长参数的魔法:灵活函数设计的秘密

哈喽,大家好,我是木头左! 什么是可变长参数? 在 Python 中,可变长参数允许你向函数传入任意数量的参数,而无需预先定义它们的个数。这为编写更加灵活和通用的函数提供了可能。可变长参数主要有两种形式&am…

记录某书请求返回406及响应{“code“:-1,“success“:false}

今天测试某个平台的爬虫时使用requests post请求正常写了个测试脚本把各种参数带上出来以后出现了406情况,和网站数据是完全一样的 以为是 X-S、X-T参接不对,但在postman里测试又是可以的成功,以为是检验了参数顺序,测试发现也没…

JavaSE基础语法合集

随着不断学习,我们已经走完了JavaSE基础语法的所有内容,博主的单独语法篇共十二篇,感兴趣的也可以去看看,内容基本一致,目录是重新排布的,数组和方法都在初识Java章节。 适合:老手复习和新手从零…

Linux下的Git应用及配置

1、卸载 2、安装 3、创建并初始化 4、配置 (附加删除语句) 5、查看(tree .git/) 6、增加和提交 7、打印日志 8、验证已操作工作

sc.tl.rank_genes_groups()问题

今天被问到了一个关于sc.tl.rank_genes_groups()的奇怪的问题 import scanpy as sc import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # from CellDART import da_cellfraction # from CellDART.utils import random_mix from…

谷歌个人开发者账号“14+20”封测没通过?你可能忽视了这个细节

众所周知,在Google play平台如果使用个人开发者账号上架应用,在提审正式版应用前,需要满足20人连续封闭测试14天的要求,不少开发者在这个阶段遇到了问题,被谷歌认为没满足要求,从而不能上架应用。 为什么你…

国产开发板——香橙派Kunpeng Pro的上手初体验

开发板(Development Board)是一种特殊的电子产品,它的主要目的是为了帮助开发者快速地设计、测试和验证电子产品的硬件和软件设计。开发板通常提供了一个完整的硬件平台,包括微控制器、存储器、接口和其他外围设备,开发…

性能狂飙:SpringBoot应用优化实战手册

在数字时代,速度就是生命,性能就是王道!《极速启航:SpringBoot性能优化的秘籍》带你深入SpringBoot的内核,探索如何打造一个飞速响应、高效稳定的应用。从基础的代码优化到高级的数据库连接池配置,再到前端…

【深度学习-第6篇】使用python快速实现CNN多变量回归预测(使用pytorch框架)

上一篇我们讲了使用CNN进行分类的python代码: Mr.看海:【深度学习-第5篇】使用Python快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例(使用pytorch框架) 这一篇我们讲CNN的多变…

Debian12安装K8S

Docker环境 添加 Docker 的官方 GPG 密钥 安装 apt 依赖包,用于通过 HTTPS 来获取仓库 sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg2 \software-properties-common添加秘钥 curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux…

OZON快蜗牛数据工具,OZON数据分析工具

在当今的电商时代,数据已经成为了商家们最宝贵的资产之一。无论是产品选品、市场定位,还是营销策略的制定,都离不开对数据的深入分析和精准把握。而在众多电商平台中,OZON以其独特的商业模式和庞大的用户群体,吸引了众…

【Elasticsearch】es基础入门-03.RestClient操作文档

RestClient操作文档 示例&#xff1a; 一.初始化JavaRestClient &#xff08;一&#xff09;引入es的RestHighLevelClient依赖 <!--elasticsearch--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest…

spring框架限制接口是否要登录过才能访问

1、引入spring 、spring boot依赖&#xff0c;这部分不再多说&#xff0c;正常开发spring boot项目就可以。 2、定义类&#xff0c;实现WebMvcConfigurer接口 package com.hmblogs.config;import com.hmblogs.config.web.interceptor.PortalTokenInterceptor; import org.spri…

JVM垃圾收集器和性能调优

目标&#xff1a; 1.JVM垃圾收集器有哪几种&#xff1f; 2.CMS垃圾收集器回收步骤。 一、JVM常见的垃圾回收器 为什么垃圾回收的时候需要STW? 标记垃圾的时候&#xff0c;如果不STW&#xff0c;可能用户线程就会不停的产生垃圾。 1.1 单线程收集 Serial和SerialOld使用单…

软件设计模式概述

一 软件模式概述 软件设计模式是在软件开发过程中经过验证的、可重复使用的最佳实践。 它们提供了解决常见设计问题的模板和指导方针&#xff0c;有助于开发人员编写高质量、可维护和可扩展的代码。 软件设计模式通常基于面向对象的编程范式&#xff0c;并利用封装、…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十八)- 微服务(8)

目录 11.4 SpringAMQP 11.4.2 Work Queue工作队列 11.4.3 发布订阅模型 11.4.4 FanoutExchange(广播交换机) 11.4.5 DirectExchange(路由模式交换机) 11.4.6 TopicExchange 11.5 消息转换器 11.4 SpringAMQP 父工程引入AMQP依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ…