C桑(Cython)从入坑到入土(1)

在这里插入图片描述

Cython 概览 ¶

Cython 是一个将类似 Python 的代码文件编译为 C 代码的编译器。尽管如此,“Cython 不是 Python 到 C 的翻译器”。也就是说,它不会将完整的程序"转换为 C"------相反,结果会充分利用 Python 运行时环境。一种看待它的方式可能是,您的代码仍然是 Python,因为它在 Python 运行时环境中运行,但不是编译为解释型 Python 字节码,而是编译为本机机器代码(但添加了额外的语法,以便轻松嵌入更快的类 C 代码)。

这有两个重要的后果:

  • 速度。不过,多少很大程度上取决于所涉及的计划。典型的 Python 数值程序往往获得的收益很少,因为大部分时间都花在以高级方式使用的较低级别 C 上。然而,当添加键入信息时,for 循环式程序可以获得许多数量级(并且因此成为现实的替代方案)。

  • 轻松调用 C 代码。 Cython 的目的之一是允许轻松包装 C 库。在 Cython 中编写代码时,您可以像调用 Python 代码一样轻松地调用 C 代码。

目前尚不支持极少数 Python 结构,尽管我们的既定目标是让 Cython 编译所有 Python 代码,但您可以看到与 Python 的局限性差异。

您的 Cython 环境 ¶

使用 Cython 包括以下步骤:

  1. 编写 .pyx 源文件

  2. 运行Cython编译器生成C文件

  3. 运行C编译器生成编译库

  4. 运行Python解释器并要求它导入模块

但是,有多种选项可以自动执行这些步骤:

  1. SAGE 数学软件系统为从交互式命令行或通过笔记本界面(如 Maple/Mathematica)使用 Cython 和 NumPy 提供了出色的支持。请参阅此文档。

  2. Cython 可以用作 Jupyter Notebook 中的扩展,只需在单元格顶部添加 %%cython 即可轻松编译和使用 Cython 代码。有关更多信息,请参阅使用 Jupyter Notebook。

  3. Cython 附带了 pyximport 的一个版本,以便您可以将 pyx 文件动态导入到 Python 中并自动编译它们(请参阅使用 pyximport 进行编译)。

  4. Cython 支持 setuptools,因此您可以非常轻松地创建自动执行该过程的构建脚本,这是 Cython 实现的库和包的首选方法。请参阅基本 setup.py。

  5. 手动编译(见下文)

注意 如果使用 SAGE 之外的其他交互式命令行环境(例如 IPython 或 Python 本身),则在重新编译模块时重新启动该进程非常重要。仅仅再次发出"进口"声明是不够的。

安装 ¶

如果您已经有 C 编译器,只需执行以下操作:

pip install Cython

否则,请参阅安装页面。

截至撰写本文时,SAGE 附带的 Cython 版本比本教程所需的版本更旧。因此,如果使用 SAGE,您应该下载最新的 Cython,然后执行:

$ cd path/to/cython-distro
$ path-to-sage/sage -python setup.py install

这会将最新的 Cython 安装到 SAGE 中。

编译 ¶

手动编译 ¶

由于了解正在发生的情况始终很重要,因此我将在这里描述手动方法。第一个 Cython 运行:

$ cython yourmod.pyx

这将创建 yourmod.c ,它是 Python 扩展模块的 C 源代码。一个有用的附加开关是 -a ,它将生成一个文档 yourmod.html ),该文档显示哪个 Cython 代码逐行转换为哪个 C 代码。

然后我们编译C文件。这可能会根据您的系统而有所不同,但 C 文件应该像构建 Python 一样构建。用于编写扩展的 Python 文档应该有一些详细信息。在 Linux 上,这通常意味着:

$ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o yourmod.so yourmod.c

gcc 应该有权访问 NumPy C 头文件,因此如果它们未安装在 /usr/include/numpy 或类似位置,您可能需要为这些文件传递另一个选项。如果您编写以下内容,则只需提供 NumPy 标头:

cimport numpy

在你的 Cython 代码中。

这会在同一目录中创建 yourmod.so ,Python 可通过使用普通的 importyourmod 语句导入该目录。

使用 setuptools 进行编译 ¶

setuptools 允许我们创建 setup.py 文件来自动编译 Cython 文件和生成的 C 文件:

from setuptools import Extension, setup
from Cython.Build import cythonize
import numpyextensions = [Extension("*", ["*.pyx"],include_dirs=[numpy.get_include()]),
]
setup(name="My hello app",ext_modules=cythonize(extensions),
)

NumPy 标头的路径通过 include_dirs=[numpy.get_include()] 参数传递给 C 编译器。

注意 使用内存视图或使用 importnumpy 导入 NumPy 并不意味着您必须添加 NumPy 包含文件的路径。仅当使用 cimportnumpy 时才需要添加此路径。

尽管如此,您仍然可能会从编译器收到如下警告,因为 Cython 不会禁用旧的已弃用的 Numpy API 的使用:

.../include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]

在 Cython 3.0 中,您可以通过在构建中将 C 宏 NPY_NO_DEPRECATED_API 定义为 NPY_1_7_API_VERSION 来消除此警告,例如:

# distutils: define_macros=NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION

或(见下文):

Extension(...,define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")],
)

对于较旧的 Cython 版本,设置此宏将使 C 编译失败,因为 Cython 生成使用此已弃用的 C-API 的代码。然而,即使在最近的 NumPy 版本中,该警告也没有负面影响。您可以忽略它,直到您(或您的库的用户)切换到更新的 NumPy 版本,该版本删除了这个长期弃用的 API,在这种情况下,您还需要使用 Cython 3.0 或更高版本。因此,越早切换到 Cython 3.0,对用户来说就越好。

未完待续…

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

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

相关文章

MES系统中的设备管理及设备数据采集

随时工厂数字化建设的大力推进,设备管理的效率得到了很大的提升,特别是作为机加工企业,设备是整个企业非常重要的核心资产。 一、设备进行数据采集面临痛点: 设备数据状况无法获取与掌握 设备老旧,信息化基础差&…

2024,传统鞋服的“高端梦”该醒了

文 | 螳螂观察 作者 | 图霖 “一千块都不要的波司登,宝贝们还不冲吗?” 入夜,一位身着羽绒服的美女主播在灯火通明的直播间正声嘶力竭地反复呐喊。 一群不知是托还是真实消费者的用户在评论区敲出自己的身高体重,想从主播那得…

Whale 帷幄创始人叶生晅:AIGC 时代,营销的范式变了丨未来 AI 谈

「未来 AI 谈」是「Marteker 营销技术官」联合「Digital Frontier 首席数字官」共同发起的一档对话栏目,旨在探讨生成式 AI 的崛起对泛营销技术和营销自动化带来的影响,以期帮助全行业探索 AIGC 时代的新营销之路。 本期嘉宾:「Whale 帷幄」创…

多级缓存架构(五)缓存同步

文章目录 一、Canal服务1. mysql添加canal用户2. mysql配置文件3. canal配置文件 二、引入依赖三、监听Canal消息四、运行五、测试 通过本文章,可以完成多级缓存架构中的缓存同步。 一、Canal服务 1. mysql添加canal用户 连接在上一次multiCache项目中运行的mys…

【NetApp数据恢复】NetApp存储中Oracle数据库数据恢复案例

NetApp数据恢复环境: NetApp某型号存储,存储中有数十块SAS硬盘,该型号NetApp存储硬盘是扇区大小是520字节。存储中的lun都映射给小型机使用,存放Oracle数据库文件,采用ASM裸设备存储方式。 NetApp存储故障&#xff1a…

DC电源模块的关键参数解读

BOSHIDA DC电源模块的关键参数解读 BOSHIDA DC电源模块是一种电子设备,用于将交流电(AC)转换为直流电(DC)供电给其他电子设备。关键参数对于了解电源模块的性能和适用范围非常重要。以下是一些常见的关键参数及其解读…

VisualGLM:推理+微调+sat的简单使用

运行的硬件消耗: CUDA_VISIBLE_DEVICES4 python web_demo.py - 显存:15303MiB / 24576MiBCUDA_VISIBLE_DEVICES4 python web_demo.py --shareCUDA_VISIBLE_DEVICES4 python web_demo.py --share --quant 4 7731MiB / 24576MiB VisualGLM,启…

Swift 周报 第四十四期

文章目录 前言新闻和社区苹果中国工厂正加速生产 Vision Pro,有望于明年2月上市美媒:苹果将在美暂停销售最新款智能手表 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第四十四期&…

算法-二分专题

文章目录 概念应用场景代码模板OJ练习寻找指定元素1题目描述输入描述输出描述样例题解 寻找指定元素2题目描述输入描述输出描述样例题解 寻找指定元素3题目描述输入描述输出描述样例题解 寻找指定元素4题目描述输入描述输出描述样例题解 寻找指定元素5题目描述输入描述输出描述…

报表生成器FastReport .Net用户指南:数据源与“Data“窗口

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…

线性方程组计算

一、题型 1)给一个线性方程组,问:唯一解?无解?无穷多解? 2)在上面的基础上,给一个未知数λ,问:当λ为几时,方程组唯一解?无解&#…

镜像迁移脚本

在日常的服务部署开发中,我们有时需要迁移环境,将服务器上的私有镜像从一个服务器迁移到另一个服务器中。在以微服务为架构的项目中,我们的一个项目可能存在大量的镜像,对每一个镜像单独进行导出打包迁移即重复又麻烦,…