Cython入门Demo(Linux)

众所周知,Python语言是非常简单易用的,但是python程序在运行速度上还是有一些缺陷。于是,Cython就应运而生了,Cython作为Python的C扩展,保留了Python的语法特点,集成C语言的参数类型指定等特点,从而加快Python代码的运行速度。本文章就Cython的入门给出一个Demo,供大家参考(以下所涉及文件均在同一目录下,Python环境为Python3)。

首先,当然是配置Cython的运行环境了,在当前的python环境下,需要有pip工具,没有的话建议你安装一个,https://pypi.org/project/pip/。拥有pip工具后,只需要运行如下命令即可搭建好Cython的运行环境了:

pip install cython

接下来,写一个名为python_evan.py的Python代码:

import math

def my_evan(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代码写一个与其对应的名为cython_evan.pyx的Cython代码:

 

cimport cython

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

cdef float _my_evan(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_evan(float a,float b):
    cdef float x = _my_evan(a, b)
    return x

基本概念:

  • Cython程序的扩展名是.pyx
  • cimport是Cython中用来引用.pxd文件的命令
  • Cython的函数使用cdef定义,并且它可以给所有参数以及返回值指定类型

注意这里使用cdef extern 的方式使用从指定头文件声明函数(在此就是使用C标准库的math.h,而非Python库中math)。 

此时,需要使用如下命令对上面的Cython文件进行编译,编译过程会调用Python或C\C++相关函数,编辑完成后会生成名为cython_evan.c文件。

cython cython_evan.pyx

如果运行以上代码出错,请查看当前系统中是否安装C或C++。

以上步骤完成后,需要写一个名为setup.py的文件来生成动态库以供Python进行调用,setup.py文件示例如下:

# 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_evan',
    sources=['cython_evan.pyx'],
    language='c',
    include_dirs=[numpy.get_include()],
    library_dirs=[],
    libraries=[],
    extra_compile_args=[],
    extra_link_args=[]
)))

参数说明:

  • ‘cython_evan’ 是我们要生成的动态链接库的名字
  • 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 的额外的链接参数(也就是生成动态链接库的时候用的)

setup.py文件书写完成后您可以使用如下命令把Cython程序编译成动态链接库:

python setup.py build_ext --inplace

当上述命令运行成功后,可以看到当前目录多出来一个cython_evan.so(动态链接库)和一个build目录等。

最后,来写一个Test.py文件对Python和Cython的计算时间进行对比:

import timeit

a, b = 30, 60
num = 8000000000

t_python = timeit.Timer("python_evan.my_evan(%f,%f)" % (a,b),"import python_evan")
t_cython = timeit.Timer("cython_evan.my_evan(%f,%f)" % (a,b),"import cython_evan")
print("python function", t_python.timeit(10000), "sec")
print("cython function", t_cython.timeit(10000), "sec")

 

转载于:https://www.cnblogs.com/eden-wang/p/cython.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值