NumPy2要来了,但先别急!

  • B站:啥都会一点的研究生
  • 公众号:啥都会一点的研究生

如果你正在使用 Python 编写代码,那么很有可能正在直接或间接地使用 NumPy

如Pandas、Scikit-Image、SciPy、Scikit-Learn、AstroPy…这些都依赖于 NumPy

NumPy 2 是一个新的重要版本,候选版本将于 2024 年 2 月 1 日发布最终版本将在一两个月后发布重要的是,NumPy 2 向后不兼容,虽然不严重,但升级时可能需要做一些工作。这意味着需要确保在 NumPy 2 发布时你的应用程序不会崩溃

本文将介绍

  • 新版本可能导致应用程序崩溃的不同方式
  • 锁定软件包版本的重要性
  • 如何确保应用程序在准备就绪之前不安装 NumPy 2
  • 如何轻松升级代码以支持 NumPy 2

NumPy2 如何破坏应用程序

NumPy2可能对应用程序造成三种不同的影响,这是由新的不兼容依赖关系引起

  • 代码:如果应用程序代码直接使用了NumPy的API,那么代码可能会出现问题
  • 直接依赖项:代码中使用的库与NumPy 2不兼容
  • 间接/传递性依赖项:代码中使用的库的依赖关系可能不兼容

修复代码可能相对容易,但直接或间接依赖的库不在你的掌控之下,通常由社区志愿者维护

以一个例子来说明,截至2024年1月9日,scikit-image

  • 与NumPy2不兼容
  • 在其打包元数据中声明与NumPy>=1.22兼容

当NumPy2发布时,可能所有现有版本都将声称与NumPy 2兼容,但实际上至少部分会出现问题。如果运气好的话,维护人员可能会在NumPy2发布时发布新的兼容版本,但这些都是志愿者,可能无法按时完成。而这只是众多库中的一个例子

锁定软件包版本

一旦NumPy 2发布,当它以新的依赖项安装时应用程序可能会出现问题

简而言之,有两种依赖项配置:

  • 直接依赖项:在代码中直接导入的库的列表,即放在 pyproject.tomlsetup.py 中的依赖项
  • 锁定文件:所有直接或间接的依赖项(依赖项的依赖项)列表,锁定到具体版本。如 requirements.txt或其他依赖项工具使用的文件

在适当的时间间隔内,根据直接依赖项列表更新锁定文件

如何确保不安装NumPy 2

由于依赖项可能需要一些时间才能与NumPy 2兼容,因此可能希望坚持使用NumPy 1.x,这意味着要确保NumPy 2不会被安装。因此,无论是直接还是间接使用NumPy,都要确保依赖列表中的限制性依赖numpy<2

例如,如果使用 pyproject.toml 文件来配置 setuptools

# ...[project]
dependencies = ["pandas",# For now, make sure NumPy 2 is not installed"numpy<2",
]

如果使用的是 setup.py,则

from setuptools import setupsetup(# ...,install_requires=["pandas",# For now, make sure NumPy 2 is not installed"numpy<2",],
)

等待依赖库支持 NumPy 2

如果最终依赖的所有库都支持 NumPy 2。记住,不仅需要验证直接依赖库,还需验证间接依赖库:查看锁定文件中的库列表

升级代码和依赖库

首先,从依赖关系中移除第 1 步中添加的 numpy<2 限制,因为不再需要

其次,如果直接使用 NumPy,需要更新一些代码用法,详见 NumPy 2 移植指南

https://numpy.org/devdocs/numpy_2_0_migration_guide.html

使用 Ruff 升级代码

迁移指南解释说可以使用 Ruff 连接器自动升级代码以支持 NumPy 2。如果还没有使用 Ruff,或许应该试试:它是 Flake8、PyLint 和许多其他工具的更快替代品。要安装它,请使用

pip install ruff

conda install conda-forge::ruff

假设有以下example.py代码

import numpy as nparr1 = np.array([1 + 3j, 2], dtype=np.cfloat)
arr2 = np.array([2.0, 3.0], dtype=np.float_)

我们可以使用 ruff 查找与 NumPy 2 不兼容的地方

$ ruff check --preview --select NPY201 example.py
example.py:3:36: NPY201 [*] `np.cfloat` will be removed in NumPy 2.0. Use `numpy.complex128` instead.
example.py:4:35: NPY201 [*] `np.float_` will be removed in NumPy 2.0. Use `numpy.float64` instead.
Found 2 errors.
[*] 2 fixable with the `--fix` option.

之所以需要使用 --preview 选项,是因为该功能在 ruff 中仍不稳定。当准备好迁移时,也就是几个月后,这条 lint 规则将有望趋于稳定

可以添加 --fix 标志让 Ruff 为我们解决问题

$ ruff check --preview --fix --select NPY201 example.py
Found 2 errors (2 fixed, 0 remaining).

现在 example.py 长这样

import numpy as nparr1 = np.array([1 + 3j, 2], dtype=np.complex128)
arr2 = np.array([2.0, 3.0], dtype=np.float64)

做好准备

NumPy 向后兼容 1.x 版本已经有一段时间了,但所有库最终都会发生向后不兼容的变化。因此应该

  • 通过 pip-tools、pipenv、poes 或 conda-lock 等工具,锁定所有直接或间接(“传递”)的依赖关系
  • 对于使用语义版本控制的库,即主要版本在不兼容的变更中发生变化的库,可以考虑添加抢先版本限制,如 numpy<2
  • 确保定期更新依赖关系

https://pythonspeed.com/articles/numpy-2/

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

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

相关文章

XXE漏洞概念

1、XXE漏洞概念 XXE(XML External Entity Injection) 又称为XML外部实体注入。 XML是一种类似于HTML&#xff08;超文本标记语言&#xff09;的可扩展标记语言&#xff0c;是用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-7 datalist

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>datalist</title> </head><body> <input id"address" list"addressList"> <datalist id"addressList"…

Web3艺术市场:NFT与数字创作的结合

在数字时代&#xff0c;随着区块链技术的崛起&#xff0c;一种新型数字资产&#xff0c;非同质化代币&#xff08;NFT&#xff09;&#xff0c;正逐渐改变传统艺术市场的格局。这种数字化的艺术品售卖方式成为了Web3艺术市场的代表&#xff0c;推动着数字创作与艺术市场的结合。…

【C++干货铺】C++11新特性——右值引用、移动构造、完美转发

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 左值与左值引用 右值与右值引用 左值引用和右值引用的比较 左值引用总结&#xff1a; 右值引用总结&#xff1a; 左值引用的作用和意义 右值引用的使用场景和…

C++ 学习系列 -- std::function 与 std::bind

一 std::function 与 std::bind 的介绍 1. std::function std::function 是 c 11 的新特性 &#xff0c;包含在头文件<functional>中&#xff0c;为了更方便的调用函数而引入。 std::function 是一个函数包装器&#xff08;function wrapper&#xff09;&#xff0c;…

CHAPTER 11: 《DESIGN A NEWS FEED SYSTEM》 第 11 章:《设计新闻系统》

在本章中&#xff0c;您将被要求设计一个新闻提要系统。什幺是新闻系统&#xff1f;根据Facebook 页面&#xff0c;“News feed 是中间不断更新的故事列表。您的主页。动态消息包括状态更新、照片、视频、链接、应用活动记录和喜欢您在 Facebook 上关注的人、页面和群组“[1]。…

Mysql运维篇(三) MySQL数据库分库分表方案

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人&#xff0c;如有侵权请留言&#xff0c;我及时删除。 一、前言 关系型数据库本身比较容易成为系统瓶颈&#xff0c;单机存储容量、连接数、处理能力都有限。当单表的数…

磁盘的分区与文件系统的认识

磁盘的认识 了解磁盘的结构&#xff1a; 1、盘片 硬盘首先会有多个盘片构成&#xff0c;类似很多个独立的光盘合并在一起&#xff0c;每个盘片都有2个面&#xff0c;每个盘片都有一个对应的磁头&#xff0c;我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置&#xff0c…

08. 面向对象编程(二)

目录 1、前言 2、多重继承 2.1、潜在的问题 3、Property 4、staticmethod 5、运算符重载 5.1、加法运算符 的重载 5.2、字符串表示运算符 str() 的重载 5.3、索引运算符 [] 的重载 6、小结 1、前言 上一篇文章中&#xff0c;我们介绍了面向对象编程的类和实例&…

v35-36.problems

1.size of&#xff08;&#xff09;运算符 根据c语言标准规范&#xff0c;Size of&#xff08;&#xff09; 里面的操作数如果不是可变长度数组类型 &#xff0c;那么此操作数就不会被执行 &#xff01;

x-cmd pkg | skate - 个人键值对存储工具

目录 简介用户首次快速实验指南功能特点竞品和相关作品进一步探索 简介 skate 是个人键值对存储工具&#xff0c;具备数据加密、云端数据备份以及多设备同步等功能。 它由 Charm 团队开发&#xff0c;借用 Charm Cloud 向用户提供一种快捷的方式来保存和检索各种数据&#xf…

零基础学习【Linux】这一篇就够了

Linux学习目录 1. Linux简介1-1. Linux系统版本 2. Linux安装2-1. 安装方式2-2. Vmware安装2-3. Linux安装2-4. Vmware克隆2-5. Vmware快照2-6. 连接工具安装 3. Linux常用命令4. Linux软件安装5. 项目部署 1. Linux简介 1-1. Linux系统版本 Linux系统分为内核版和发行版 内核…

「斗破年番」大紫研爆虐六星斗皇,佛怒火连回归,异火焚烧分身

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《斗破苍穹年番》第80期超前爆料&#xff0c;据透露韩枫以海心焰这一异火贡献给了慕骨老人&#xff0c;换取了一具斗宗躯体。通过灵魂融入&#xff0c;他成功达到了斗宗四星阶段。而与小医仙对决的莫天行&#xff0c;尽管两人实力…

Java设计模式详解-更新中

收藏和关注的同时&#xff0c;请也关注 公众号 “IT技术馆” 各位大家好&#xff0c;从今天开始&#xff0c;作者开始整理 《JAVA软件设计模式&#xff08;GOF&#xff09;》 专栏。请各位多多关注&#xff01; 该专栏是根据作者的技术经验和设计模式的了解&#xff0c;进行详…

从零开始c++精讲:第三篇——内存管理

文章目录 一、C/C内存分布二、C语言中动态内存管理方式:malloc/calloc/realloc/free三、C中动态内存管理四、operator new与operator delete函数4.1 operator new与operator delete函数&#xff08;重点&#xff09; 五、new和delete的实现原理5.1内置类型5.2 自定义类型 六、定…

代码随想录二刷 | 回溯 | 组合优化

代码随想录二刷 &#xff5c; 回溯 &#xff5c; 组合优化 剪枝优化 剪枝优化 在遍历的过程中有如下代码&#xff1a; for (int i startIndex; i < n; i) {path.pop_back();backtracking(n, k, i 1);path.pop_back(); }n 4&#xff0c;k 4的话&#xff0c;那么第一层f…

打折:阿里云国外服务器价格购买优惠活动

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

idea 折叠某段代码 这段特定某段代码

如何折叠IntelliJ IDEA代码片段_w3cschool ctrlALTT

圆的参数方程是如何推导的?

圆的参数方程是如何推导的? 1. 圆的三种参数表示2. 三角函数万能公式3. 回到圆的参数方程1. 圆的三种参数表示 已知圆的第一种参数方程为: x 2 + y 2 = r x^2+y^2=r x2+y2=r   圆的图像如下: 通过上图,不难理解,圆的参数方程还可以用三角函数表示,也就是第二种参数表…

计算机毕业设计 | SpringBoot学生成绩管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 开发一个学生成绩管理系统&#xff0c;采用计算机对学生成绩进行处理&#xff0c;进一步提高了办学效益和现代化水平。为广大教师和学生提高工作效率&#xff0c;实现学生成绩信息管理工作流程的系统化、规范化和自动化。现在我国中学的学生…