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 setup

setup(
    # ...,
    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 np

arr1 = 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 np

arr1 = 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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络逻辑示意图工具

现代网络容纳了来自不同供应商的大量设备&#xff0c;支持一系列新技术&#xff0c;并跨越了分布在多个位置的边界&#xff0c;随着网络变得越来越复杂&#xff0c;网络管理员发现越来越难以跟踪网络领域的所有当代进步和发展&#xff0c;这使得网络管理比以往任何时候都更具挑…

Java8的Stream最佳实践

从这一篇文章开始&#xff0c;我们会由浅入深&#xff0c;全面的学习stream API的最佳实践&#xff08;结合我的使用经验&#xff09;&#xff0c;本想一篇写完&#xff0c;但写着写着发现需要写的内容太多了&#xff0c;所以分成一个系列慢慢来说。给大家分享我的经验的同时&a…

hadoop必记知识点(1)

1.Hadoop是什么&#xff0c;解决什么问题&#xff1f; Hadoop是一个由Apache基金会所开发的分布式系统基础架构。它可以让使用者在普通的硬件上搭建起一个强大的计算集群。Hadoop的特点包括&#xff1a;高可靠性、高扩展性、高容错性、支持大数据和高并发等。Hadoop核心组件包…

python写完程序怎么运行

python有两种运行方式&#xff0c;一种是在python交互式命令行下运行; 另一种是使用文本编辑器直接在命令行上运行。 注&#xff1a;以上两种运行方式均由CPython解释器编译运行。 当然&#xff0c;也可以将python代码写入eclipse中&#xff0c;用JPython解释器运行&#xff0c…

推荐系统|2.4 矩阵分解的目的和效果

文章目录 矩阵分解矩阵分解的必要性和方法隐向量 矩阵分解 矩阵分解的必要性和方法 比如原本是一个 m n m\times n mn规模大小的矩阵,经过分解后可得到两个矩阵一个是 m k m\times k mk&#xff0c;另外一个是 k n k\times n kn,于是总占用空间为 ( m n ) k (mn)\times k…

腾讯云.com域名报价

腾讯云com域名首年价格&#xff0c;企业新用户注册com域名首年1元&#xff0c;个人新用户注册com域名33元首年&#xff0c;非新用户注册com域名首年元85元一年&#xff0c;优惠价75元一年&#xff0c;com域名续费85元一年。腾讯云百科txybk.com分享腾讯云com域名注册优惠价格&a…

【C语言编程之旅 7】刷题篇-函数

第1题 解析 A&#xff1a;错误&#xff0c;一个函数只能返回一个结果 B&#xff1a;正确&#xff0c;将形参存在数组中&#xff0c;修改数组中内容&#xff0c;可以通过数组将修改结果带出去 C&#xff1a;正确&#xff0c;形参如果用指针&#xff0c;最终指向的是外部的实参…

Unity3D学习之UI系统——GUI

文章目录 1. 前言2. 工作原理和主要作用3. 基础控件3.1 重要参数及文本和按钮3.1.1 GUI 共同点3.1.2 文本控件3.1.3 按钮控件 3.2 多选框和单选框3.2.1 多选框3.2.2 单选框3.2.3 输入框3.2.4 拖动条 3.3 图片绘制和框3.3.1 图片3.3.2 框绘制 4 工具栏和选择网格4.1 工具栏4.2 选…

Docker(十一)Swarm mode

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Swarm mode Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎&#xff0c;成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm …

Liunx系统和Window系统有什么区别

在信息技术世界里&#xff0c;操作系统扮演着至关重要的角色&#xff0c;它负责管理和控制计算机硬件与软件资源。Linux和Windows是市面上两个最流行的操作系统。接下来&#xff0c;我们将深入研究这两种操作系统的主要差异。 核心体系结构及源代码访问&#xff1a; 首先&#…

node介绍

1.node是什么 Node是一个基于Chrome V8引擎的JS运行环境。 Node不是一个独立的语言、node不是JS框架。 Node是一个除了浏览器之外的、可以让JS运行的环境 Node.js是一个让JS运行在服务端的开发平台&#xff0c;是使用事件驱动&#xff0c;异步非阻塞I/O&#xff0c;单线程&…

团灭 LeetCode 股票买卖问题

这几道题目是有共性的&#xff0c;我们只需要抽出来力扣第 188 题「188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09;」进行研究&#xff0c;因为这道题是最泛化的形式&#xff0c;其他的问题都是这个形式的简化&#xff0c;看下题目&#xff1a; 第一题是只…

RHCE上课笔记(前半部分)

第一部分 网络服务 第一章 例行性工作 1.单一执行的例行性工作 单一执行的例行性工作&#xff08;就像某一个时间点 的闹钟&#xff09;&#xff1a;仅处理执行一次 1.1 at命令&#xff1a;定时任务信息 [rhellocalhost ~]$ rpm -qa |grep -w at at-spi2-core-2.40.3-1.el9.x…

一条sql是如何运行的

在我们平时使用sql的时候&#xff0c;基本是基于黑盒的使用方式&#xff0c;在客户端输入一条sql语句&#xff0c;然后回显想要的数据&#xff0c;对于mysql server端内部如何运行的以及与存储引擎如何交互的不得而知。 通过下面一幅图&#xff0c;大致描述客户端和服务端交互…

重定位(一)段的概念引入

1.2440结构图 对于2440来说&#xff0c;cpu可以直接发指令给SRAM、网卡、SDRAM、NOR FLASH&#xff0c;但无法直接控制NAND FLASH,必须由NAND FLASH控制器来操作NAND FLASH&#xff0c;但为什么我们的裸机程序烧入NAND FLASH还可以运行呢&#xff1f; 这就引入了重定位机制&…

matlab appdesigner系列-常用12-日期选择器

日期选择器&#xff0c;目的就是显示时间&#xff0c;时间格式目前常用的 正序2024/1/19 也有倒序 19/1/2024 或者写成年-月-日格式的&#xff0c; 此示例&#xff0c;为当用户要更改日期时&#xff0c;弹出对话框提示&#xff1a;把日期从XXX改到XXX&#xff1f;确认日期…

热血江湖服务端服务器架设教程

热血江湖服务端服务器架设教程 大家好&#xff0c;我是艾西今天简单的说下热血江湖架设需要哪些东西然后怎么操作&#xff0c;不管你是自己玩还是对外开放&#xff0c;这对于有兴趣的小伙伴总的都是一件好事。技多不压身就是这么个道理&#xff0c;当你需要用上时还希望能记起…

【二叉树练习2】

文章目录 判断是否是完全二叉树找出p和q的最近的公共祖先非递归实现前序遍历非递归实现中序遍历非递归实现后序遍历 判断是否是完全二叉树 boolean isCompleteTree(TreeNode root){if (root null){return true;}//创建队列Queue<TreeNode> queue new LinkedList<>…

Midjourney在线绘画及提示词精选库

网址:https://chat.xutongbao.top/ 一碗面粉&#xff1a; Self-Rising Flour in a 50s colourful bowl. professional photograph --ar 720:1170 --v 6 烟花古建筑&#xff1a; At night, with the snow-covered scenery of the Beijing Forbidden City as the backdrop, brill…

linux内核源码编译2.6失败

centos7环境 iso选择 https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 自带qemu&#xff0c;未实测是否可用 选择编译版本2.6 下载地址 遇到的编译错误解决 yum list | grep curses yum install ncurses-devel.x86_64 -y yum i…