cython

Cython 编程入门

在学习和训练mask rcnn中发现用了cython编程,特此整理。

简介

Cython是一个快速生成Python扩展模块的工具,从语法层面上来讲是Python语法和C语言语法的混血,当Python性能遇到瓶颈时,Cython直接将C的原生速度植入Python程序,这样使Python程序无需使用C重写,能快速整合原有的Python程序,这样使得开发效率和执行效率都有很大的提高,还能加速程序的速度。

准备

方法1 官网下载安装,Cython官网地址是:http://cython.org/
方法2 直接用在现有环境下直接用anaconda安装cython
使用命令 conda install cython

cython注意事项

1…pyx中用cdef定义的东西,除类以外对.py都是不可见的;
2.py中是不能操作C类型的,如果想在.py中操作C类型就要在.pyx中从python object转成C类型或者用含有set/get方法的C类型包裹类;
3.虽然Cython能对Python的str和C的“char *”之间进行自动类型转换,但是对于“char a[n]”这种固定长度的字符串是无法自动转换的。需要使用Cython的libc.string.strcpy进行显式拷贝;
4.回调函数需要用函数包裹,再通过C的“void *”强制转换后才能传入C函数。

cython 编程实践

方法一

1 首先编写一个hello.pyx的脚本

print('hello world')

2 然后我们新建一个setup.py脚本,这个python文件的目的就是使用cython编译器去编译pyx成一个cython文件,代码很简单

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("hello_world.pyx")
)

3 执行setup.py脚本

python setup.py build_ext --inplace

这时候cython将我们的pyx文件解析成一个c文件和一个so文件(linux)或者pyd文件(windows)。这个so文件或者pyd文件就可以像普通的python文件一样,被import。

import hello_world

在这里插入图片描述

方法二

但是每次都需要写一个setup文件十分不方便,所以cpython提供了另一种解决方法

import pyximport
pyximport.install()
import hello_world

这样cython会默默帮我们编译好了,放在其他地方,灰常方便我们的使用。

方法三

1 首先编写一个hello.pyx的脚本

print('hello world')

2 然后我们新建一个setup.py脚本,这个python文件的目的就是使用cython编译器去编译pyx成一个cython文件,代码很简单

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("hello_world.pyx")
)

3 执行setup.py脚本

python setup.py build_ext --inplace

这时候cython将我们的pyx文件解析成一个c文件和一个so文件(linux)或者pyd文件(windows)。

4 编写一个同名的py文件

import sys, pkg_resources, imp

def __bootstrap__():
  global __bootstrap__, __loader__, __file__
  __file__ = pkg_resources.resource_filename(__name__, 'hello world.so')
  __loader__ = None
  del __bootstrap__, __loader__
  imp.load_dynamic(__name__, __file__)

__bootstrap__()

这时候我们直接impor这个py文件就可以了。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值