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

news2024/12/25 13:49:59

在这里插入图片描述

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 numpy

extensions = [
    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.coloradmin.cn/o/1378333.html

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

相关文章

Visual Studio中项目添加链接文件

这个需求在VS里面使用还真不多见,只是最近在做项目的版本编号的时候遇到一个头大的问题,我一个解决方案下面有几十个类库,再发布的时候这几十个类库的版本号必须要统一,之前我们都是在单个的AssemblyInfo.cs里面去改相关的信息&am…

CCF模拟题 202309-2 坐标变换(其二)

问题描述 试题编号: 202309-2 试题名称: 坐标变换(其二) 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 对于平面直角坐标系上的坐标 (x,y),小 P 定义了如下两…

如何解决NAND系统性能问题?--NAND分类

一、故事引言 想象一下,你正在管理一座神奇的数据仓库,这个仓库没有沉重的门、旋转的磁盘和机械手臂,而是由一群训练有素的“数据小飞侠”组成。这些小飞侠们居住在一个叫做闪存芯片(NAND Flash,本文主人公&#xff0…

【Linux】进程信号——进程信号的概念和介绍、产生信号、四种产生信号方式、阻塞信号、捕捉信号、阻塞和捕捉信号的函数

文章目录 进程信号1.进程信号的概念和介绍2.产生信号2.1通过终端按键产生信号2.2 调用系统函数向进程发信号2.3 由软件条件产生信号2.4硬件异常产生信号 3.阻塞信号3.1信号在内核中的表示3.2信号集操作函数3.3sigprocmask 4.捕捉信号4.1内核如何实现信号的捕捉4.2 sigaction 进…

Docker安装MySql详细步骤

1、新建挂载目录 首先进入安装mysql的目录,没有就自行创建 mkdir -p /usr/local/docker/mysql-docker cd /usr/local/docker/mysql-docker 接着挂载目录 # 选择自己的软件安装目录,新建挂载文件目录 mkdir -p data logs mysql-files conf # 赋予权限…

xcode安装及运行源码

抖音教学视频 目录 1、xcode 介绍 2、xcode 下载 3、xocde 运行ios源码 4、快捷键 1、xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有…

使用主题模型和古老的人类推理进行无监督文本分类

一、说明 我在日常工作中不断遇到的一项挑战是在无法访问黄金标准标签的情况下标记文本数据。这绝不是一项微不足道的任务,在本文中,我将向您展示一种相对准确地完成此任务的方法,同时保持管道的可解释性和易于调整。 一些读者可能已经开始考…

小程序商城的优势是什么?

随着科技的飞速发展,电商行业也在不断变革。其中,电商小程序商城系统以其独特的优势,正在成为电商领域的新宠。本文将深入探讨电商小程序商城系统的优势,展望其未来发展前景。 一、便捷快速:体验至上 与传统电商网站相…

Vulnhub-GoldenEye

一、信息收集 nmap探测:nmap -p 1-65535 -T4 -A -v 192.168.1.9 PORT STATE SERVICE VERSION 25/tcp open smtp Postfix smtpd |_smtp-commands: ubuntu, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN |_…

CMake+大漠插件的应用开发——处理dm.dll,免注册调用大漠插件

文章目录 CMake大漠插件的应用开发——处理dm.dll,免注册调用大漠插件说明环境项目结构配置编译环境编码-直接调用 dll编码-生成tlh文件,便于提示 CMake大漠插件的应用开发——处理dm.dll,免注册调用大漠插件 说明 网上有一种使用方式是&am…

iOS xcode 15.1 打包报错

真机调试的时候没问题,打包的时候报错了 #报错 解决办法 pods.xcodeproj - build phases - compile sources - compiler flags pods.xcodeproj - Targets-support files pods-xx-frameworks

使用emu8086实现——运算类编程实验

一、实验目的 1. 掌握使用运算类指令编程及调试方法 2. 掌握运算类指令对各个状态标志位的影响及其测试位。 二、实验内容 1.在数据表DATA1中存放数据 0F865H,在数据表DATA2中存放数据360CH。现编写出将两数分别取出相加,然后将计算结果存放到当前数据…

【UE Niagara学习笔记】05 - 喷射火焰顶部的蓝色火焰

在上一篇博客(【UE Niagara学习笔记】04 - 火焰喷射时的黑烟效果)的基础上继续实现在火焰喷射的起点位置生成蓝色火焰的效果。 目录 效果 步骤 1. 创建新的发射器 2. 减少粒子生成数量 3. 减小粒子初始大小 4. 减少粒子喷射距离 5. 减少粒子初始…

逆变器2(原理框图)

总流程 输入(低压直流24Vdc)——升压(DC—DC)(高压直流369Vdc) ——逆变(DC—AC)(交流220V) 升压电路:BOOST电路、LLC电路、推挽电路 逆变器过程…

Nginx服务安装

Nginx(发音为[engine x])专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消 耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持30000~50000个并发请求)。正因 为如此,大量提供社交网络、…

Swin Transformer 学习笔记(附代码)

论文地址:https://arxiv.org/pdf/2103.14030.pdf 代码地址: GitHub - microsoft/Swin-Transformer: This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows". 1.是什么&#x…

Mr_HJ / form-generator项目文档学习与记录(续2)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…

Python入门0基础学习笔记

1.编程之前 在编写代码之前,还有两件事需要做: 安装 Python 解释器:计算机是没法直接读懂 Python 代码的,需要一个解释器作为中间的翻译,把代码转换成字节码之后再执行。 Python 是翻译一行执行一行。一般说的安装 …

AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(七)

08.什么是模块化? CommonJS 标准 09.ECMAScript 标准 - 默认导出和导入 10.ECMAScript 标准 - 命名导出和导入 11.包的概念 实操: server.js utils/lib/index.js utils/package.json 12.npm - 软件包管理器 13.npm - 安装所有依赖 从别处(网…

游戏测试大揭秘,帮你轻松过关

游戏测试可以看作是软件测试的一个分支,黑盒测试最基本的要求是会玩游戏。小公司会要求测试能力更加全面的员工,其中除了功能测试还要会性能测试,兼容测试,弱网测试,自动化测试等。 游戏测试是游戏开发过程中必不可少…