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

这篇具有很好参考价值的文章主要介绍了C桑(Cython)从入坑到入土(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C桑(Cython)从入坑到入土(1),Py,与珎同行录,vscode,c语言,开发语言,pytorch

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,对用户来说就越好。

未完待续…文章来源地址https://www.toymoban.com/news/detail-793978.html

到了这里,关于C桑(Cython)从入坑到入土(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PB从入坑到放弃(六)动态SQL应用

    动态 SQL 语句是部分或者整个 SQL 语句在运行时才能确定,可以更好的与用户进行交互,大大提高了 SQL 的灵活性 1.1 执行无入参SQL ① 语法 ② 说明 SQLStatement -- 有效SQL语句字符串 TransactionObject --事务对象名 省略时使用 SQLCA ③ 举个栗子 删除员工信息表emp 1.2 执行带参数SQL ①

    2024年02月14日
    浏览(33)
  • PB从入坑到放弃(五)窗口使用技巧

    PB 应用程序就是由许多共同协作完成特定任务的窗口组成的集合。 窗口在应用程序的开发工作中占有很大的比重,是非常重要的一个 PB 对象 窗口类型 描述 Main ①可以覆盖其他窗口,也可以被其他窗口覆盖 ②可以最大、最小化,可以用鼠标改变其 大小 ③可以有边框,可以有

    2024年02月16日
    浏览(37)
  • PB从入坑到放弃(一)第一个HelloWorld程序

    网上关于 PowerBuilder 的资料确实是少之又少。 为了方便,后面我们都用 pb 来代替 PowerBuilder 说到这不得不来说说自己的 pb 入坑经历, 自己也不是计算机科班出生。 刚到公司面试,听到 pb 也是一脸懵逼,这啥东西,从来没听过。 然而,不知不觉已经干了好几年😔 也是有了这

    2024年02月11日
    浏览(43)
  • PB从入坑到放弃(七)PBer们的福音来了

    也许现在的你需要用PB完成毕业设计、需要维护远古时代的代码,又或者是你呆的公司就是要求要用PB开发项目。 不管你是出于什么原因还在使用PB,不可否认PB在数据窗口非常优秀,熟练使用之后开发数据库相关的应用非常高效 但由于PB这一框架出现得比较早,而且主要用于

    2024年02月14日
    浏览(38)
  • C桑(Cython)从入门到入土(2): np数组操作对比

    实际上, 👆🏻这个错误是我探索 Cython 的缘起… code1: Form: 更现代的方法是使用内存视图而不是指针: [:,;,::1] 语法告诉 Cython 内存视图在内存中是 3D 和 C 连续的。将类型定义为内存视图而不是 numpy 数组的优点是 它可以接受定义缓冲区接口的任何类型,例如内置数组模块或来

    2024年01月16日
    浏览(40)
  • 安装cython_bbox报错解决办法:Preparing metadata (setup.py) ... error error: subprocess-exited-with-error

    报错内容如下图所示: 解决办法: 先安装Cpython然后再安装cython_bbox 注意在ubuntu系统下去安装,在windows系统上我尝试了还是安装不成功,还没发现如何解决,如果有成功方法的可评论区留言。

    2024年02月11日
    浏览(72)
  • vscode 第一个文件夹在上一层文件夹同行,怎么处理

    我的是这样的 打开终端特别麻烦 解决方法就是 打开vscode里边的首选项 进入设置 把 Compact Folders 下边对勾给勾掉

    2024年02月14日
    浏览(66)
  • Vscode将.ui文件转成.py文件方法

    目录 一、 vscode 安装扩展库PYQT Integration 二、设置路径 三 、ui文件导入vscode;右键选择选择PyQT:Complite Form选项 ,自动生成Ui_layout_qiantao.py 四、可以打开designer.exe重新编辑             自动生成Ui_layout_qiantao.py  

    2024年02月13日
    浏览(32)
  • vscode 无法导入自己写的模块文件(.py)问题

    问题主要是在 vscode中 python 的 读入模块路径 存在问题,下面先介绍下python的模块读入路径: 什么是PYTHONPATH? PYTHONPATH是一个环境变量,用于指定Python解释器在导入模块时搜索模块的路径。当我们导入一个模块时,Python解释器首先会在系统默认的路径中搜索模块,然后再到PY

    2024年02月14日
    浏览(40)
  • VScode导入不同模块下py文件报错ModuleNotFoundError:No module named最有效解决方法

    1、用VScode执行代码,即F5执行,或者是在服务器上用Python命令执行,修改地方为: ctrl+P,选择open user settings:UI,打开设置  然后搜索terminal.integrated.env,点击用json编辑,加上下面这几句: 然后在debug里面create 一个json文件,加上下面这两句:  保存,重启,再次运行即可。

    2024年01月20日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包