Pandas 2.0发布——更快的速度更低的内存占用

news2024/12/30 3:46:36

【重磅】Pandas 2.0发布!更快的速度更低的内存占用!

Pandas 是一个用于操作数据的 Python 库,在 Python 开发人员中非常流行。尤其在数据科学和机器学习领域中,Pandas已经成为不可或缺的基础库。

4月3日,Pandas 2.0正式发布。2.0是Pandas的一个里程碑式的版本。回顾Pandas的历史,从诞生时到 1.0 花了超过十年的时间,1.0的发布标志着Pandas DataFrame API 趋于稳定;时隔3年(Pandas 1.0于2020年正式发布)后,Pandas 2.0更多是在性能和可用性上进行了提升。具体改进包括:

  • 使用 pip extras 安装可选的依赖项
  • 更快的计算速度和更低的内存占用
  • 索引可以保存 NumPy 数字类型
  • 写时复制优化

img

文章目录

    • Pandas 2.0的改进
      • 使用 pip extras 安装可选的依赖项
      • 更快的计算速度和更低的内存占用
      • 索引可以保存 NumPy 数字类型
      • 写时复制优化
    • 为什么要用Arrow
      • 规范缺失值
      • 高性能
      • 互操作性
    • 总结

Pandas 2.0的改进

使用 pip extras 安装可选的依赖项

pip extras 是指在使用 Python 包管理器 pip 安装 Python 包时可以选择安装的附加功能或依赖项。这些可选依赖项通常用于提供默认情况下不需要但对某些用户可能有用的额外功能。包维护者在包的 setup.pypyproject.toml 文件中定义了这些“附加功能”。

要安装具有附加功能的软件包,可以使用以下命令:

pip install package_name[extra1,extra2,...]

例如,安装Pandas 2.0时我们可以指定其附加功能:

pip install "pandas[performance, aws]>=2.0.0"

pip extras 的引入解决了很多过去安装Pandas的痛点:

  1. 可选性:extras 提供了一种选择性安装依赖项的方式,这意味着用户可以根据自己的需求来决定是否需要安装附加功能。这使得安装过程更加灵活。
  2. 减小包的大小:通过将一些附加功能的依赖项设置为可选的,可以减小 Python 包的大小。这有助于避免不必要的依赖项安装,从而节省存储空间和带宽。
  3. 提高兼容性:有些额外功能可能需要特定的操作系统或库版本。将这些功能作为 extras 提供,可以确保在没有这些特定依赖项的环境中,包的核心功能仍然可以正常工作。
  4. 简化依赖管理:将某些功能的依赖项设置为 extras,可以简化依赖管理,使得用户在安装和更新包时更容易处理和维护依赖项。

Pandas 2.0提供了 [all, performance, computation, fss, aws, gcp, excel, parquet, feather, hdf5, spss, postgresql, mysql, sql-other, html, xml, plot, output_formatting, clipboard, compression, test] 扩展,具体内容请参考安装指南。

更快的计算速度和更低的内存占用

Pandas最大的改进是引入PyArrow作为可选后端,从而获得了更快的计算速度和更低的内存占用。

PyArrow是 Apache Arrow C++接口的Python绑定。Apache Arrow 是一种开源的、跨语言的内存数据处理平台。Apache Arrow 旨在通过提供高效的数据结构和 API 来提高数据处理任务的性能,以便在大数据和高性能计算(HPC)环境中使用。得益于Apache Arrow的诸多优势,采用PyArrow作为后端的Pandas 2.0性能得到显著提升。下面是一组常见操作对比:

操作NumPy用时Arrow用时速度提升
read parquet (50Mb)141 ms87 ms1.6x
mean (int64)2.03 ms1.11 ms1.8x
mean (float64)3.56 ms1.73 ms2.1x
endswith (string)471 ms14.9 ms31.6x

Pandas 2.0做了很好的向下兼容,2.0的发布没有破坏1.0的API。默认情况下,pandas 将继续使用Numpy作为后端,数据类型也是原始类型。例如:

import pandas
pandas.Series([1, 2, 3, 4])
# 0    1
# 1    2
# 2    3
# 3    4
# dtype: int64
pandas.Series(['foo', 'bar', 'foobar'])
# 0       foo
# 1       bar
# 2    foobar
# dtype: object

上面的代码和输出跟Pandas 1.0一摸一样。我们可以通过dtype参数将后端切换为PyArrow。

pandas.Series([1, 2, 3, 4], dtype='int64[pyarrow]')
# 0    1
# 1    2
# 2    3
# 3    4
# dtype: int64[pyarrow]

pandas.Series(['foo', 'bar', 'foobar'], dtype='string[pyarrow]')
# 0       foo
# 1       bar
# 2    foobar
# dtype: string

在读取数据时,我们可以通过dtype_backend选项告诉Pandas使用哪种后端。当该选项设为numpy_nullable时,将返回nullable dtypes类型的DataFrame;如果设为pyarrow,则会返回ArrowDtype类型的DataFrame。

索引可以保存 NumPy 数字类型

索引可以保存 NumPy 数字类型让Pandas 2.0能够更好的索引、更快的访问和计算。

Pandas 1.0 的 Index 仅支持int64uint64float64 3种类型;Pandas 2.0 允许 Index 保存任何 NumPy 数字数据类型,包括 int8int16int32int64uint8uint16uint32uint64float32float64

因此,以前创建 64 位索引的操作现在可以创建具有较低位大小的索引,例如 32 位索引。

pd.Index([1, 2, 3], dtype=np.int8)
# Index([1, 2, 3], dtype='int8')

pd.Index([1, 2, 3], dtype=np.uint16)
# Index([1, 2, 3], dtype='uint16')

pd.Index([1, 2, 3], dtype=np.float32)
# Index([1.0, 2.0, 3.0], dtype='float32')

写时复制优化

写时复制优化有点类似Spark的做法,它是一种内存优化技术,用于提高性能并减少处理大型数据集时的内存使用量。当你复制 pandas 对象(如 DataFrame 或 Series)时,pandas 不会立即创建数据的新副本,而是创建对原始数据的引用并推迟创建新副本,直到你以某种方式修改数据。

这意味着如果你有相同数据的多个副本,它们都可以引用相同的内存,直到你对其中一个进行更改。 这样可以显着减少内存使用并提高性能,因为不需要创建不必要的数据副本。

总的来说,写时复制是一种强大的优化技术,可以帮助程序更高效地处理大型数据集,并且占用更少的内存。

为什么要用Arrow

在使用Pandas 2.0时,我建议大家都选择 PyArrow 作为后端。因为 PyArrow 提供了几个关键特性,包括:

  1. 高效的内存列式数据表示:Arrow 使用列式内存布局,与基于行的布局相比,这种布局在分析处理方面更为高效。这种布局实现了更快的数据访问,并提高了缓存利用率,从而提高了整体性能。
  2. 零拷贝数据共享:Arrow 允许在进程和语言之间进行零拷贝数据共享,这最小化了数据序列化和反序列化开销。这一特性在涉及多种语言和系统的大数据处理管道中尤为有用。
  3. 与语言无关的数据结构:Arrow 定义了一种可以在不同编程语言之间使用的标准化数据结构,使得在 Python、Java、R 和 C++ 等语言之间共享数据变得更容易。
  4. 与其他库和系统的互操作性:pyarrow 与 Pandas 和 NumPy 等流行的 Python 数据处理库以及 Apache Parquet、Apache Spark 和 Apache Hadoop 等数据处理框架实现了无缝集成。
  5. GPU 支持:Arrow 通过像 NVIDIA 的 RAPIDS 这样的库支持基于 GPU 的计算,使用户能够为数据处理任务利用 GPU 的计算能力。

除了上述底层特性带来带来的优势,PyArrow 还会带来一下直接优点:

规范缺失值

Pandas用标签方法表示缺失值:

  • 数值类型:NaN
  • 对象类型:None

其中,None是一个Python对象,所以不能作为任何NumPy/Pandas数组类型的缺失值,只能用于’object’数组类型(即由python对象构成的数组)。

Pandas 处理缺失值的方法是将数字转换为浮点数(如果还没有),并使用 NaN 作为缺失值。 比如:

s1 = pandas.Series([1, 2, 3, 4])
# 0    1
# 1    2
# 2    3
# 3    4
# dtype: int64

s1 = pandas.Series([1, 2, 3, None])
# 0    1.0
# 1    2.0
# 2    3.0
# 3    NaN
# dtype: float64

上面的代码可以看到,当存在缺失值时,Pandas将所有数值都转换为浮点数。将整数值转换为浮点表示法以支持缺失值同样不理想,并且有副作用。其中之一是Pandas中任意两个缺失值不相等(np.nan != np.nan)

此外,在将数组添加到 Pandas 之后,Pandas 可以为缺失值添加自己的数据类型。 这些是通过使用两个数组而不是一个数组来实现的。 主数组以与没有缺失值相同的方式表示数据。 但是还有一个额外的布尔数组,它指示主数组中的哪些值存在并且需要考虑,哪些不存在且必须忽略。

而Apache Arrow 内存中缺失值是统一的规范标准。 通过使用 Arrow,Pandas 能够更方便地处理缺失值,而无需为每种数据类型实现自己的缺失值版本。

高性能

Apache Arrow 提供了一个内存中的列数据结构,它具有几个主要优点:

  • 随机访问时间复杂度为 O ( 1 ) O(1) O(1)
  • 内置原生向量优化
  • 系统间数据转换快速高效

随机访问时间复杂度为 O ( 1 ) O(1) O(1),是因为数据被格式化为面向列的数据结构。

因为Arrow的执行引擎利用了现代处理器中包含的 SIMD 操作。 这意味着,任何处理 Arrow 数据结构的算法都将非常快。

系统之间的数据交换非常快速和高效,是因为 Arrow 避免了开销巨大的数据序列化。

这些特性让Pandas 2.0采用Arrow比采用NumPy性能提升巨大。

互操作性

就像 CSV 是独立于项目的文件格式一样,Arrow 也是一种独立于程序的格式。这点可能不是那么直观,因为Arrow是一种内存格式,而不是文件格式。但即便它没有关联的文件扩展名,你也可以将其视为可以由实现了其开放规范的不同消费者访问的数据。这让不同程序之间共享数据(相对)简单且标准。 而且它可以以极快且内存高效的方式完成,因为两个程序可以真正共享相同的数据(相同的内存,而不必为每个程序制作副本)。

总结

总的来说,得益于 PyArrow的引入,Pandas 2.0 实现了更快、更节省内存的操作。

有关新 Pandas 2.0 的更多信息,请阅读官方文档。

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

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

相关文章

ESLint 与 Prettier 配合解决代码格式问题

可以了解下Prettier,官网:Prettier 中文网 Prettier 是一个“有态度”的代码格式化工具 Prettier常见的一些配置: tabWidth:指定缩进宽度,默认为 2,建议设置为 4;printWidth:指定代…

MyBatis核心配置文件详解

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><environments default"…

页面布局基础知识

一、布局方案 1、什么是静态布局 概念 静态布局&#xff0c;也称为固定布局&#xff0c;是一种传统网页设计。页面布局使用绝对长度单位&#xff0c;采用固定宽度。忽略浏览器实际&#xff0c;网页布局始终按照最初写代码时的布局来显示。 优点&#xff1a;简单 缺点&#xf…

可视化图表组件体系的构建(内附全套开源文件)

Part01————————前言 EasyV作为一个低代码数字孪生可视化搭建平台&#xff0c;其图表组件作为可视化项目建设的基础构成发挥着重要的作用。 经过多年可视化项目交付经验&#xff0c;沉淀了一套形态多样、样式精细、高配置度的数据可视化图表。 Figma开源文件社区获取入…

【MySQL | 进阶篇】05、MySQL 视图、触发器讲解

目录 一、视图 1.1 介绍 1.2 语法 1.2.1 演示示例 1.3 检查选项 1.3.1 CASCADED 级联 1.3.2 LOCAL 本地 1.3.3 示例演示 1.4 视图的更新 1.4.1 示例演示 1.5 视图作用 1.6 案例 二、触发器 2.1 介绍 2.2 语法 2.3 案例 2.3.1 插入数据触发器 2.3.2 修改数据…

国内版 ChatGPT值不值得上手----PlumGPT测评

前言&#xff1a;什么是PlumGPT&#xff08;国内版的chatgpt&#xff09;&#xff0c;PlumGPT国内版ChatGPT是一个基于GPT-3.5算法的人工智能聊天机器人&#xff0c;能够通过自然语言与用户交互&#xff0c;提供各种服务和解答各种问题。本文将对PlumGPT国内版ChatGPT进行全面测…

NetSuite GPT的辅助编程实践

作为GPT综合症的一种表现&#xff0c;我们今朝来探究下GPT会不会抢了我们SuiteScript的编程饭碗&#xff0c;以及如何与之相处。以下内容来自我个人的实践总结。 我们假设一个功能场景&#xff1a; 为了让用户能够在报价单上实现“一键多行”功能&#xff0c;也就是在报价中可…

【精华】AIGC之文生视频及实践应用

AIGC之文生视频及实践应用 &#xff08;一&#xff09;序言 从 Stable Diffusion 到 Midjourney&#xff0c;再到 DALLE-2&#xff0c;文生图模型已经变得非常流行&#xff0c;并被更广泛的受众使用。随着对多模态模型的不断拓展以及生成式 AI 的研究&#xff0c;业内近期的工…

78-Linux_tcp服务器客户端编程流程

tcp服务器客户端编程流程一.c/s模型1.什么是c/s模型?2.c/s模型的逻辑二.TCP服务器端和TCP客户端的工作流程1.流程2.TCP三次握手3.TCP四次挥手一.c/s模型 1.什么是c/s模型? 答:(c/s)模型即(客户端/服务器端)模型 所有的客户都通过服务器端访问所需资源. 模型如图所示: 2.c…

Python样条插值和坐标映射

文章目录样条插值基本原理scipy实现坐标映射样条插值基本原理 由于数组本身是格点化了的&#xff0c;所以对数组的旋转、平移和缩放&#xff0c;并不像实数空间中那么简单。以一维的平移为例&#xff0c;现有三个点&#xff0c;坐标为0,1,2&#xff0c;值对应为a,b,c&#xff…

小黑子—多媒体技术与运用基础知识二:数字音频处理技术

多媒体技术与运用2.0多媒体系列第二章1. 音频处理概述1.1 什么是声音1.2 声音的基本参数1.3 人的听觉特性1.4 音频信号处理过程2.音频的数字化2.1 音频的采样2.2 音频的量化2.3 声道数2.3 音频的编码与压缩2.4 数字音频的质量3.音频文件格式及标准3.1 波形文件格式3.2 MPEG音频…

打造高效Android应用,从Hilt注入框架开始

概述 在 Android 开发中&#xff0c;注入解耦是一种设计模式&#xff0c;用于解决代码耦合的问题。通过使用注入技术&#xff0c;可以将应用程序中的不同部分解耦&#xff0c;从而使得代码更加灵活、易于维护和升级。 在 Android 中&#xff0c;注入解耦通常使用依赖注入&…

R -- 如何处理缺失数据

brief 识别缺失值 当传入向量&#xff0c;返回的是包含逻辑向量的等长向量。complete.cases()用来识别矩阵或者数据框有没有包含缺失值的行&#xff0c;若整行数据完整则返回TRUE&#xff0c;若行数据包含缺失值&#xff0c;不管几个缺失值则返回FALSE。 探索缺失值模式 列表图…

高速存储器

由于CPU和主存储器之间的速度上的不匹配限制了计算机系统的工作速度&#xff0c;为了提高CPU和主存之间的数据传输率&#xff0c;可以采用并行技术的存储器&#xff1a; 双端口存储器多模块交叉存储器 双端口存储器 同一个存储器具有两组相互独立的读写控制线路&#xff0c;…

Direct3D 12——灯光——聚光灯光

一个与聚光灯光源&#xff08;spotlight&#xff09;相近的现实实例是手电筒。从本质上来说&#xff0c;聚光灯由位置Q向方向d 照射出范围呈圆锥体的光。 一个聚光灯以位置Q向方向d发射出半顶角为Φmax 的圆锥体范围的光 其中&#xff0c;P为被照点的位置&#xff0c;Q是聚光…

基于html+css的盒子展示8

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

一文4000字使用JavaScript+Selenium玩转Web应用自动化测试

自动化测试 在软件开发过程中, 测试是功能验收的必要过程, 这个过程往往有测试人员参与, 提前编写测试用例, 然后再手动对测试用例进行测试, 测试用例都通过之后则可以认为该功能通过验收. 但是软件中多个功能之间往往存在关联或依赖关系, 某一个功能的新增或修改可能或影响到…

手把手教你搭建ROS阿克曼转向小车之(霍尔编码器数据读取与速度计算)

上一篇文章已经介绍了如何驱动直流有刷电机转动起来&#xff0c;这篇文章讲解如何获取编码器的计数值&#xff0c;并且计算出速度信息。在实际的运行中&#xff0c;随着机器的重量不一样&#xff0c;电机受到的阻力就会不一样&#xff0c;给定同样的PWM在不同载重的情况下速度会…

Alien Skin ExposureX8最新ps中文版调色滤镜插件

Exposure是用于创意照片编辑的最佳图像编辑器。Exposure结合了专业级照片调整&#xff0c;庞大的华丽照片外观库以及高效的设计&#xff0c;使其使用起来很愉悦。新的自动调整功能可简化您的工作流程&#xff0c;并使您进入创意区。 Alien Skin Exposure 拥有超过500种预设效果…

基于线性支持向量机的词嵌入文本分类torch案例

一、前言 简介线性支持向量机,并使用线性支持向量机实现文本分类, 输入文本通过词嵌入方法转换成浮点张量,给出torch案例 线性支持向量机&#xff08;Linear Support Vector Machine&#xff0c;简称Linear SVM&#xff09;是一种常用的分类算法&#xff0c;它通过一个超平面来…