cython的使用

2023-05-16

0. 环境配置

要使用cython首先得有的她的环境 [ 废话,^_^ ],系统上有pip包管理环境的话直接:pip install cython 即可安装cython或者也可以源码安装:
https://github.com/cython/cython/wiki/Installing

1. 相关介绍:

  • Cython 编译器把 Cython 代码(格式为XX.pyx)编译成 C/C++ 代码,然后把生成的C/C++代码编译成动态链接库(Linux上的XX.so动态库文件,Windows上对应的是XX.pyd文件),这个动态链接库可以被Python解释器直接加载使用,从而调用Cython相关模块,引用下官方文档的话:

    Cython code must, unlike Python, be compiled. This happens in two stages:
  • A .pyx file is compiled by Cython to a .c file, containing the code of a Python extension module
  • The .c file is compiled by a C compiler to a .so file (or .pyd on Windows) which can be import-ed directly into a Python session.
    There are several ways to build Cython code:
  • Write a distutils setup.py. This is the normal and recommended way.
  • Use pyximport, importing Cython .pyx files as if they were .py files (using distutils to compile and build in the background).
  • Run the cython command-line utility manually to produce the .c file from the .pyx file, then manually compiling the .c file into a shared object library or DLL suitable for import from Python. (These manual steps are mostly for debugging and experimentation.)
  • Use the [Jupyter] notebook or the [Sage] notebook, both of which allow Cython code inline.

2. cython使用示例:

一些基本概念:
  • Cython 程序的扩展名是 .pyx
  • cimport 是 Cython 中用来引入 .pxd 文件的命令
  • Cython 的函数使用 cdef 定义,并且他可以给所有参数以及返回值指定类型。

一个简单的Python计算方法,python_evaluate.py:

import math

def my_evaluate(a ,b):
    x = math.pi/180.0
    c = math.sin(a*x) + math.cos(b*x)
    r = math.sin(c*a) + math.cos(c*b)
    return r

python_evaluate.py对应的cython文件python_evaluate.pyx:

cimport cython

python_evaluate.pyx
cdef extern from "math.h":
    float cosf(float theta)
    float sinf(float theta)

cdef float _my_evaluate(float a,float b):
    cdef float pi = 3.14159265
    cdef float x = pi/180.0

    cdef float c = sinf(a*x) + cosf(b*x)
    cdef float r = sinf(c*a) + cosf(c*b)
    return r

def my_evaluate(float a,float b):
    cdef float x = _my_evaluate(a, b)
    return x

注意这里使用cdef extern 的方式使用从指定头文件声明函数(在此就是使用C标准库的math.h,而非Python库中math)。
Cython 程序需要先编译之后才能被 Python 调用,具体步骤是:

  • Cython 编译器把 Cython 代码(格式为XX.pyx,这个文件可以调用Python或C\C++相关函数)编译成 C/C++ 代码;
  • 把生成的代码编译成动态链接库(Linux XX.so or Windows XX.pyd )
  • Python 解释器载入动态链接库

要完成前两步,linux和Windows上有点不太一样分别说明下吧[其实就是生成的最终文件不一样 ^_^]:

1. Linux

linux和Windows 都可以用下面的setup.py生成动态库供Python调用:

# setup.py
#python setup.py build_ext --inplace
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy

setup(ext_modules = cythonize(Extension(
    'cython_evaluate',
    sources=['cython_evaluate.pyx'],
    language='c',
    include_dirs=[numpy.get_include()],
    library_dirs=[],
    libraries=[],
    extra_compile_args=[],
    extra_link_args=[]
)))

解释下相关参数:

  • ‘cython_evaluate’ 是我们要生成的动态链接库的名字
  • sources 里面可以包含 .pyx 文件,以及后面如果我们要调用 C/C++ 程序的话,还可以往里面加 .c / .cpp 文件
  • language 其实默认就是 c,如果要用 C++,改成 c++
  • include_dirs 这个就是传给 gcc 的 -I 参数(numpy.get_include()其实这个只是示例,本程序不需要)
  • library_dirs 这个就是传给 gcc 的 -L 参数
  • libraries 这个就是传给 gcc 的 -l 参数
  • extra_compile_args 就是传给 gcc 的额外的编译参数,比方说你可以传一个 -std=c++11
  • extra_link_args 就是传给 gcc 的额外的链接参数(也就是生成动态链接库的时候用的)

执行下面命令就可以把 Cython 程序编译成动态链接库:
python setup.py build_ext –inplace

当运行成功后,可以看到在当前目录多出来了 cython_evaluate.c (是cython根据cython_evaluate.pyx生成的 C 程序)和 cython_evaluate.so(一个动态链接库),还有一个build目录。

调用time_cmp.py 对Python和cython的计算时间进行对比。

import timeit

a, b = 30, 60
num = 8000000000

t_python = timeit.Timer("python_evaluate.my_evaluate(%f,%f)" % (a,b),"import python_evaluate")
t_cython = timeit.Timer("cython_evaluate.my_evaluate(%f,%f)" % (a,b),"import cython_evaluate")
print "python function", t_python.timeit(10000), "sec"
print "cython function", t_cython.timeit(10000), "sec"

运行结果:

python time_cmp.py
python function 0.0105509757996 sec
cython function 0.00193190574646 sec

可见,虽然这个Python模块计算模块比较简单,但是用cython重写下性能提升还是有的~~~

为了解释setup.py的原理,写了个用gcc分步骤编译的脚本build.sh:

#!/bin/bash

# This shell is used to explain how cython setup.py works.
#

if [ $# -ne 1 ];then
    echo "parameters error!!"
    echo "usage: $0 XXX { The name of XXX.pyx, exclude .pyx}"
    echo "e.g.:sh build.sh cython_evaluate"
    exit 1
fi

name=$1

python_inc=`ls /usr/include/ | grep python`

echo "python headers:$python_inc"

#  Will create a ${name}.c file
cython ${name}.pyx

# Compile the object file
gcc -c -fPIC -I/usr/include/${python_inc}/ ${name}.c

# Link it into a shared library
gcc -shared ${name}.o -o ${name}.so

这个脚本其是就是官方文档中所提到的第三种方法,“There are several ways to build Cython code:”

Run the cython command-line utility manually to produce the .c file from the .pyx file, then manually compiling the .c file into a shared object library or DLL suitable for import from Python. (These manual steps are mostly for debugging and experimentation.)

运行脚本:
sh build.sh cython_evaluate
同样也能生成供Python调用的动态链接库cython_evaluate.so。

2. Windows

其实Windows下和Linux下的基本差不多,cmd,运行如下命令:
d:\Python27\python setup.py build_ext –inplace

d:\Python27\python 这个是我的Windows上python可执行程序的绝对地址。最终生成俩文件:cython_evaluate.c,cython_evaluate.pyd,这个cython_evaluate.pyd文件和Linux上的XX.so文件相当,Python 解释器载入会载入这个文件从而找到我们的函数实现。

3. 写出高效的cython

Cython 中类型声明非常重要,但是我们不加类型标注它依然是一个合法的 Cython 程序(这样的又变成Python动态类型的问题,很多编译期间就能确定下来的事情被推到了运行时,性能会打折扣), Cython 提供了一个很好的工具,可以方便地检查 Cython 程序中哪里可能可以进一步优化。下面命令既可以对 XX.pyx 进行分析:
cython -a cython_evaluate.pyx

如果当前 Cython 程序用到了 C++,则需要加上 –cplus 参数。在成功运行完 cython -a 之后,会产生同名的 .html 文件,如下图:
html

网页最上面与说明,黄色部分标识了和 Python 发生交互的地方,点击每一行可以查看相应的生成的 C/C++ 代码。本Bolg相关代码见:github。

参考

  1. https://github.com/cython
  2. https://github.com/cython/cython/wiki/Installing
  3. http://docs.cython.org/en/latest/src/quickstart/build.html
  4. https://zhuanlan.zhihu.com/p/24311879?utm_medium=social&utm_source=wechat_session&from=singlemessage&isappinstalled=1
  5. https://stackoverflow.com/questions/125367/dynamic-type-languages-versus-static-type-languages
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cython的使用 的相关文章

随机推荐

  • CentOS7.X 新装后个性化处理

    目录 1 修改HostName2 Shell脚本中文乱码问题解决3 部分常用开发工具安装4 常用开发工具安装PS 1 修改HostName 设置自定义HostName hostnamectl set hostname MyHostName
  • ffmpeg命令行提示“no such file or directory...”

    最近参考一博客测试使用ffmpeg将rtsp流分片成ts文件 xff0c 附上大神博客链接 xff0c 很有用 xff01 xff01 xff01 https blog csdn net kunzai6 article details 76
  • Python pygame安装过程笔记

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • PyQtgraph结合Pyside6绘图解决pyqtgraph模块无GraphicsWindow的问题

    解决前辈的示例的问题 发生异常 AttributeError module pyqtgraph has no attribute GraphicsWindow 代码如下 xff1a 将 xff1a win 61 pg GraphicsWin
  • Proteus&keil-51单片机-外部中断控制流水灯

    实现功能 利用P0端口进行花样显示 xff0c 显示顺序为 xff1a 8个LED灯依次左移点亮 xff1b 8个LED灯依次右移点亮 xff1b xff0c LED0 LED2 LED4 LED6亮1秒熄灭 xff0c LED1 LED3
  • 51单片机-60秒计时

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 关于计算几何某些定理·基础知识的汇总

    欧拉定理 xff1a 设平面图的顶点数 xff0c 边数和面数分别为V xff0c E和F xff0c 则V 43 F E 61 2 直线方程两点式转换为一般式 xff1a 1 两点式 xff1a y y2 y1 y2 61 x x2 x1
  • C51单片机和ADC0832芯片设计数字电压表

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • opencv for python绘制箭靶并标注环数

    先从外到内循环绘制圆 再添加数字 有待改进 最后绘制十字线 span class token comment 绘制箭靶并标注环数 span span class token keyword import span cv2 span clas
  • opencv for python 绘制圆角矩形

    span class token comment 绘制100 240像素 圆角20的矩形 span span class token keyword import span cv2 span class token keyword as s
  • opencv鼠标指针左键画图,右键清除.

    span class token comment 按住鼠标左键画图 双击鼠标左键可以清除 span span class token keyword import span cv2 span class token keyword as s
  • macOS命令释放可释放空间(不用CleanMyMac)

    背景 众所周知 xff0c CleanMyMac的 释放可清除空间 功能非常厉害 xff0c 在用户明明已经删除了大量文件腾出几十G空间的情况下 xff0c macOS的存储管理里面仍然会显示可用空间不足 xff0c 甚至升级大型软件会提示
  • 使用 PyInstaller 把python程序 .py转为 .exe 可执行程序

    最近使用Python为项目开发一款绘图工具 绘出 声场三维模型 因为希望能把Python脚本发布为脱离Python平台运行的可执行程序 xff0c 比如单个 的exe文件 PyInstaller恰满足这个需求 本文PyInstaller的版
  • 字符串最小周期串问题

    问题描述 xff1a 如果一个字符串可以由某个长度为n的字符串重复多次得到 xff0c 则该串以n为周期 例如 xff0c abcabcabcabc以3为周期 xff08 注意 xff0c 它也以6和12为周期 xff09 输入一个长度不超
  • linux 下使用 rsync 进行文件 同步

    rsync 介绍 rsync是类unix系统下的数据镜像备份工具 remote sync rsync是一个功能非常强大的工具 xff0c 其命令也有很多功能特色选项 xff0c 我们下面就对它的选项一一进行分析说明 它的特性如下 xff1a
  • linux 下安装、使用 redis

    redis介绍 Redis是一个开源 支持网络 基于内存 键值对存储数据库 xff0c 使用ANSI C编写 xff0c redis中文官方网站 xff0c 点这里 redis安装 我的linux操作系统为ubuntu12 04 登录 ht
  • 奇异递归模板模式(CRTP)应用--表达式模板(expression template) 2

    1 表达式模板 xff08 expression template xff09 概述 首先分几个部分介绍下expression template 1 1 表达式模板 xff08 expression template xff09 是什么 x
  • Codeforces Round #210 (Div. 2)

    本不想写 xff0c 毕竟就打了一个小时 xff08 训练题变成个人赛了T T xff09 xff0c 但是第一次水题4分钟搞定 xff0c 手速一点没涨 xff0c 纯粹就是脑子快 A Levko and Table 题意 xff1a 输
  • C++自动微分(Automatic differentiation)原理1

    0 缘由 下面介绍下为什么要引入自动 自动微分 automatic differentiation gt AD 一个优化问题的例子 假设现在我们在解决一个机器学习的问题 xff0c 有了一些训练样本 xff0c 现在需要寻找一个最优的函数
  • cython的使用

    0 环境配置 要使用cython首先得有的她的环境 废话 xff0c xff0c 系统上有pip包管理环境的话直接 xff1a pip install cython 即可安装cython或者也可以源码安装 https github com