首页 > 编程问答 >使用类型提示将 Python 转换为 Cython

使用类型提示将 Python 转换为 Cython

时间:2024-07-27 04:27:09浏览次数:10  
标签:python optimization cython python-typing

类型提示现在在 Python 3.5 版本中可用。在规范 ( PEP 484 ) 中,目标(和非目标)被明确暴露:

#Rationale and Goals

此 PEP 旨在为类型注释提供标准语法,开放Python 代码更容易静态分析和重构、潜在的运行时类型检查以及(也许在某些情况下)利用类型信息生成代码。 [...]

在这些目标中,静态分析是最重要的。

#非目标

使用类型提示 性能优化 留给读者作为练习。

另一方面,Cython 长期以来一直使用静态语法来提高性能。通常,人们使用 Cython 语法重写一些代码,编译它们,然后将它们作为独立模块导入回来。在大型代码库上完成所有这些工作是一项痛苦的工作。但最糟糕的是,即使您正确遵循上述所有步骤,您也不能保证您会有真正的改进(因为如果您使用某些模块,可能会导致兼容性问题)。|| |编写一个工具来

使用这种新类型提示 分散在代码中的东西 自动将它们转换为 Cython 语法 并可能完成其余的工作(编译它们)将是一项艰巨的任务到模块并将它们全部导入回来)?因此,有可能在所有代码库中共享相同的语言语法。 理论上,可以编写这样的工具,但我不确定是否值得(就编写它的复杂性而言)真正的改进是产量)。

谢谢。

Thanks.


编写一个能够利用 Python 类型提示自动将 Python 代码转换为 Cython 代码的工具确实是一项艰巨的任务。这在技术上是可行的,但这并不简单,而且需要仔细权衡这种方法的复杂性和潜在收益。

让我们来探讨一下涉及的挑战和注意事项:

  1. 类型提示的复杂性: Python 的类型提示系统虽然功能强大,但可能相当复杂。它支持泛型、Union 类型、可调用类型、文字类型等等。一个能够处理所有这些用例的强大工具需要一个全面的类型提示系统解析器和解释器。

  2. Cython 的限制: Cython 虽然与 Python 紧密集成,但并不能支持 Python 类型系统的每个特性。某些高级类型提示(如使用 typing 模块中的 Protocol 或复杂泛型的提示)不能直接转换为 Cython 等效项。

  3. 推断类型: 在许多情况下,类型提示可能并不详尽。一个好的工具将需要执行类型推断(类似于 MyPy 所做的)以填写缺失的类型信息。这本身就是一个复杂的任务。

  4. 代码转换: 将类型提示转换为 Cython 的语法需要对 Python 和 Cython AST(抽象语法树)有深入的了解。该工具需要修改代码、添加 Cython 特定的声明并可能重构代码的某些部分以适应 Cython 的语义。

  5. 编译和导入: 该工具需要处理 Cython 代码的编译过程,包括管理依赖项和确保正确导入生成的模块。这可能会给不同的系统和环境增加另一层复杂性。

潜在收益:

  • 减少样板文件: 自动转换可以消除手动将代码转换为 Cython 语法的需要,从而减少样板文件并可能减少错误。
  • 改进的维护: 在一个代码库中使用单个语法可以简化维护,并可能使不熟悉 Cython 的开发人员更容易做出贡献。
  • 渐进式采用: 该工具可以促进对大型代码库进行渐进式 Cython 采用,从而允许开发人员专注于可以从性能改进中获益最大的关键部分。

值得吗?

最终,工具的价值取决于几个因素,例如项目的规模和复杂性、对性能的需求以及团队的专业知识。对于大型代码库,在关键性能部分中大量使用类型提示,这样的工具可以证明其开发成本是合理的。

替代方案:

  • 逐步转换: 与其尝试完全自动化,不如考虑逐步将 Python 代码转换为 Cython,从性能关键部分开始。
  • 混合方法: 将类型提示用于文档和类型检查(使用 MyPy 等工具),并使用显式 Cython 声明来获得性能至关重要的代码部分。

总之,虽然构建一个完全自动化的 Python 到 Cython 转换工具是一项艰巨的任务,但这并非不可能。仔细考虑权衡取舍、潜在收益以及项目的具体限制对于确定此方法是否值得至关重要。

标签:python,optimization,cython,python-typing
From: 38018780

相关文章

  • 在 Python 类型提示中区分 PySpark 和 Pandas DataFrame (PyCharm)
    在PyCharm中,如果使用apyspark.sql.DataFrame代替pandas.DataFrame,类型提示似乎不会触发警告,反之亦然。例如以下代码根本不会生成任何警告:frompyspark.sqlimportDataFrameasSparkDataFramefrompandasimportDataFrameasPandasDataFramedef......
  • 如何在Python中继承类型提示?
    所以我的问题是,当我有一个A类型的类来做事情并且我使用这些函数作为subclass(B)时,它们仍然是类A的类型,并且不接受我的类B对象作为参数或作为函数签名。我的问题简化了:fromtypingimportTypeVar,Generic,CallableT=TypeVar('T'......
  • Python - 如何传递类对象的函数参数类型(打字)
    我想python3.7附带了(不确定),不仅可以将变量名传递给函数,还可以传递变量的类型。我想知道的是是否有可能传递特定类的类型。以同样的方式传递:deffoo_func(i:int)->None:pass如果我有一个类,让我们说:classfoo_class(object):pass我如何转换fo......
  • 使用 Python 构建简单 REST API
    使用Python构建简单RESTAPI1.概述本技术文档旨在指导开发者使用Python框架Flask构建一个基本的RESTAPI。通过学习本指南,您将掌握创建、读取、更新和删除(CRUD)操作的基本知识,并能够使用Python构建自己的API。2.安装依赖首先,您需要确保已安装Python和Flask......
  • Python——Pandas(第二讲)
    文章目录变量类型的转换Pandas支持的数据类型在不同数据类型间转换建立索引新建数据框时建立索引读入数据时建立索引指定某列为索引列将索引还原变量列引用和修改索引引用索引修改索引修改索引名修改索引值更新索引Series的索引和切片DataFrame的索引和切片选择列按......
  • 基于Python+Django的红色文化研学网站设计与实现
    ......
  • 【python】对网站进行请求-初识
    python实现对网站进行请求代码如下importrequestsdefget_data(url,headers=None,params=None,timeout=10):try:res=requests.get(url,headers=headers,params=params,timeout=timeout)res.raise_for_status()returnres.text......
  • 【python】Django初识-从未有如此美妙的开局
    Django初识python、Django安装与验证python安装Python官网https://www.python.org/Django安装pipinstallDjango验证python是否安装成功python--version验证Django是否安装成功python3-mdjango--version创建第一个Django项目项目创建与服务器启动打开cmd,输......
  • Python虚拟环境创建、激活、使用,项目依赖导出、安装requestments.txt
    Python虚拟环境通过命令行终端创建python虚拟环境:新建一个文件夹,可以专门用来存放虚拟环境,这里在D盘创建Python_Virtual_Environment_test文件夹然后在这里输入cmd按回车键进入命令行终端此时打开的位置就是当前的路径,当然也可以 cd一步步进入到目标路径创建环境......
  • 使用 Python 脚本自动生成报告
    使用Python脚本自动生成报告1.简介本文档介绍如何使用Python脚本自动生成报告。此脚本旨在简化报告生成过程,提高效率并减少人为错误。2.需求Python3.6或更高版本Pandas库Matplotlib库3.安装使用pip安装必要的库:pipinstallpandasmatplotlib4.脚本im......