pandas 多进程与并发

news2024/11/20 22:39:49

1. 背景

        在大规模数据之间完成一些操作,往往会浪费大量的时间,为了充分利用软硬件资源,演化出了2种主流的优化方式,即“向量化” 和“并行化” 。

2. swifter

        swifter 是一款用于给使用在 pandas DataFrame 或者 Series 上的 function 进行加速的包,它综合使用了“向量化” 和“并行化”方式。
安装:

pip install -U pandas # upgrade pandas
pip install swifter # first time installation
pip install -U swifter # upgrade to latest version if already installed
或 conda 安装
conda install -c conda-forge swifter

   

2.1 一个demo

import pandas as pd
import swifter

df = pd.DataFrame({'x': [1, 2, 3, 4], 'y': [5, 6, 7, 8]})
# runs on single core
df['x2'] = df['x'].apply(lambda x: x**2)
# runs on multiple cores
df['x2'] = df['x'].swifter.apply(lambda x: x**2)
# use swifter apply on whole dataframe
df['agg'] = df.swifter.apply(lambda x: x.sum() - x.min())

# use swifter apply on specific columns
df['outCol'] = df[['col1', 'col2']].swifter.apply(my_func)
df['outCol'] = df[['col1', 'col2', 'col3']].swifter.apply(my_func,
             positional_arg, keyword_arg=keyword_argval)

2.2 swifter 提效原理

1、它会判断apply中的函数是否能被向量化vectorization,如果可以,那么他就会自动选择向量化后函数的进行应用(此时是效果最好的);

2、如果apply的函数无法向量化,则自动选择使用 dask parallel processingsimple pandas apply 中较快的一种;

3、在分组apply的场景下,swifter也能达到更好的效果。

注意:并行化在小规模的数据集上可能达不到预期的效果,所以并行化操作是根据应用场景酌情使用的,而向量化不管数据集规模的大小都能带一些性能的提升。

        可以看到Swifter的个特点,即无论数据大小如何,使用向量化效果几乎总是更好;如果数据量较小,那么普通 Pandas 操作有最佳速度,直到数据足够大为止;一旦超过阈值,并行处理就会是处理更快。

3. 多进程 pandarallel

        pandarallel 和 pandas 无缝衔接,是实现多线程的一个非常友好的工具。
安装:pip3 install pandarallel

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from pandarallel import pandarallel
# shm_size_mb  分配的内存空间大小
# nb_workers  调用的核数
pandarallel.initialize(nb_workers=10, use_memory_fs=False, progress_bar=True)

def func(x):
    return x**3
df = pd.DataFrame(np.random.rand(1000,1000))

调用

# 处理一行
df.parallel_apply(func, axis=1)  
# 按列处理
df['col1'].parallel_apply(func)

下面的这些pandas原来的方法都有对应的pandarallel的并行的实现。

参考:pandas apply 并行处理的几种方法_parallel_apply-CSDN博客

4. joblib

from math import sqrt
from joblib import Parallel, delayed
def test():
    start = time.time()
    result = Parallel(n_jobs=8)(delayed(sqrt)(i**2) for i in range(10000))
    # results = Parallel(n_jobs=8)(delayed(key_func)(group) for name, group in tqdm(data_grouped))    
    end = time.time()
    print(end-end)

11

5. multiprocessing

import multiprocessing as mp
with mp.Pool(mp.cpu_count()) as pool:
    df['newcol'] = pool.map(fun, df['col'])

multiprocessing.cpu_count()  # 返回系统的CPU数量。

该数量不同于当前进程可以使用的CPU数量。可用的CPU数量可以由 len(os.sched_getaffinity(0)) 方法获得。

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

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

相关文章

解决flask中jinja2插值变量变成字符串的办法

今天在通过使用{{ variable_name }}这种方式插入html内容时,发现变量内容到了页面中全部变成了字符串, python代码: return render_template(FilePath.file_path_to_page,md_contenthtml_content # 返回html内容 )html代码中插入&#xff1…

【Linux】自定义shell

👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 文章目录 获取命令行前置字段命令行输入解析命令行普通指令的执行子进程执行命令指令类型判断 && 内建命令总结 &&a

农业无人机行业分析:单年内作业量突破13亿亩次

面对我国18亿亩的耕地植保市场需求,未来我国植保无人机将依然保持快速发展态势,预计2022年我国植保无人机销量将增长至8万架。 植保无人机市场呈现爆发式增长,同时也吸引了不少企业进入,我们从2022年植保无人机企业网络热度榜中可…

重启阿里云ESC服务器后,数据库与jar包外面无法访问bug

bug 重启了服务器,发现从外面无法连接数据库 原因 使用firewall-cmd --list-all命令查看服务器防火墙的配置,发现没有开启3306端口的开放,虽然我们在安全组设置3306端口但是防火墙没有开启,外面是依然无法访问的。 firewall-cm…

计算机视觉开发工程师怎么考?报考难度大吗?证书含金量高吗?

为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求,深入实施人才强国战略和创新驱动发展战略,加强全国数字化人才队伍建设,持续推进人工智能专业人员…

内存泄漏检测方式

一 、 日志记录 通过宏定义重载了 malloc 和 free 函数,以在分配和释放内存的时候记录一些信息,包括文件名和行号,并将这些信息写入到相应的文件中。然后在 main 函数中演示了使用这些宏进行内存分配和释放。 _malloc 函数: 在分配…

Markdown 流程图绘制详解

✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向) 🐳博客主页: 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN 🔔如果文章对您有一定的帮助请&#x1f…

二叉树的深度遍历

目录 深度优先遍历: 二叉树节点定义: 递归法: 前序 中序 后序 迭代法: 前序 中序 后序 迭代法(统一写法) 前序 中序 后序 广度优先遍历: 二叉树的遍历方法包括两种&#xff1a…

Vue创建项目配置情况

刚开始接触vue项目创建和运行因为node版本和插件版本不一致时长遇到刚装好插件,项目就跑不起来的情况,特此记录一下 vue -V vue/cli 5.0.8 node -v v12.22.12 npm -v 6.14.16 关闭驼峰命名检查、未使用语法检查 package.json文件内容: {&…

3dmax渲染出现马赛克该怎么办?

为什么渲染会出现马赛克问题呢,什么原因导致的呢,该如何解决呢? 原因一 3dmax渲染出来马赛克可能是因为勾选了 dont reder final image(不渲染最终图像),所以导致3dmax渲染出来马赛克。 解决方法: 打开渲染器设置菜…

web练习2

需求 1.计算用户指定的数值内的奇数和。例如用户输入的是10则计算13579的和 <!doctype html> <html lang"en"> <head><meta charset"utf-8"><title>作业1</title></head> <body> <script>//计算用…

迅软科技丨IT企业如何应对数据泄密危机?

随着信息技术的快速发展&#xff0c;软件IT行业面临着前所未有的数据安全挑战。黑客攻击、病毒传播、内部泄密等安全威胁层出不穷&#xff0c;给企业的核心资产和运营带来严重威胁。同时&#xff0c;国家对于数据安全的法律法规也日益严格&#xff0c;要求企业必须采取更加有效…

边缘计算的挑战和机遇(结合RDH-EI)

边缘计算的挑战和机遇 边缘计算面临着数据安全与隐私保护、网络稳定性等挑战&#xff0c;但同时也带来了更强的实时性和本地处理能力&#xff0c;为企业降低了成本和压力&#xff0c;提高了数据处理效率。因此&#xff0c;边缘计算既带来了挑战也带来了机遇&#xff0c;需要我…

瑞_Java开发手册_(七)设计规约

文章目录 设计规约的意义设计规约 &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的设计规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约&#xff0c;所以本系列专栏主要以这本书进行讲解和拓展&#xff0c;有需要的小伙伴可以点击链接…

K8S中使用helm安装MinIO

注意事项 使用helm部署MinIO分为两部分 helm部署MinIO operator&#xff0c;用来管理tenant&#xff08;K8S集群中只能部署一个&#xff09;helm部署MinIO tenant&#xff0c;真实的MinIO Cluster&#xff08;K8S集群中可以部署多个&#xff09; 使用helm部署到K8S集群&…

CC工具箱使用指南:【获取所有字段信息】

一、简介 这个工具的目的简单易懂&#xff0c;就是获取选定要素图层的所有字段信息。 本身不对要素图层作任何处理&#xff0c;只是一个查看属性的工具。 问我要用在什么地方&#xff0c;我也不知道-_- 二、工具参数介绍 点击【信息获取】组里的【获取所有字段信息】工具&a…

vue3二次封装element-ui中的table组件

为什么要做这件事 借助封装table组件的过程来巩固一下vue3相关知识点。 组件有哪些配置项 options:表格的配置项data: 表格数据源elementLoadingText&#xff1a;加载文案elementLoadingSpinner&#xff1a;加载图标elementLoadingBackground&#xff1a;背景遮罩的颜色elem…

解码Java SPI:深入理解与实践【七】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解码Java SPI&#xff1a;深入理解与实践【七】 前言SPI机制简介&#xff1a;SPI的工作原理java标准SPI示例总结 前言 在编写Java应用程序时&#xff0c;我们经常需要使用不同的库和框架来扩展功能。…

NET Core发布 HTTP Error 500.31 - Failed to load ASP.NET Core runtime

记录一下踩过的坑&#xff1a; 首先&#xff0c;不论是500.31还是500.30 &#xff0c;首先确保安装了三个文件 1.NET Core RunTime 2.NET SDK 3.NET Hosting 其次&#xff0c;确保三个文件的版本一致&#xff0c;如下&#xff1a; 要装就统一装同一个大版本&#xff0c;不要东…

streamlit配合plotly绘制交互式图表

借助st.plotly_chart实现 官方介绍&#xff1a;st.plotly_chart 案例&#xff1a; import pandas as pd import plotly.graph_objs as go import plotly.express as pxst.subheader("课题组成员", dividerred) df pd.read_excel("./data/summary.xlsx"…