众所周知,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")

Cython入门Demo(Linux)的更多相关文章

  1. 【SSH系列】初识spring+入门demo

    学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...

  2. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  3. apollo入门demo实战(二)

    1. apollo入门demo实战(二) 1.1. 下载demo 从下列地址下载官方脚本和官方代码 https://github.com/nobodyiam/apollo-build-scripts ...

  4. lua入门demo(HelloWorld+redis读取)

    1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ...

  5. netty入门demo(一)

    目录 前言 正文 代码部分 服务端 客服端 测试结果一: 解决粘包,拆包的问题 总结 前言 最近做一个项目: 大概需求: 多个温度传感器不断向java服务发送温度数据,该传感器采用socket发送数据 ...

  6. canal入门Demo

    关于canal具体的原理,以及应用场景,可以参考开发文档:https://github.com/alibaba/canal 下面给出canal的入门Demo (一)部署canal服务器 可以参考官方文 ...

  7. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  8. SpringBoot 入门 Demo

    SpringBoot   入门 Demo Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从 ...

  9. ReactJs 入门DEMO(转自别人)

    附件是分享的一些他人的ReactJs入门DEMO,以前版本使用的是JSXTransformer.js,新版的用browser.min.js替代了. DEMO 下载地址:http://files.cnb ...

随机推荐

  1. Linux IPC实践(9) --System V共享内存

    共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...

  2. 前端框架Bootstrap - 快速搭建网站

    Bootstrap简介         Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.是一个CSS/HTML/JavaScript框架.Bootstrap是基于HTML5和C ...

  3. python3爬虫 - cookie登录实战

    http://blog.csdn.net/pipisorry/article/details/47948065 实战1:使用cookie登录哈工大ACM网站 获取网站登录地址 http://acm.h ...

  4. Ext.Net 1.x_Ext.Net.GridPanel之Access数据库分页显示

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  5. Linux C OSS音频编程

    在linux下也可以写一个类似麦克风和喇叭这样的应用程序,只要打开/dev/dsp这个设备驱动,对该设备read读操作相当于录音,对这个设备write写操作相当于放音. 对于以下出现的一些参数我就不多 ...

  6. Android调用binder实现权限提升-android学习之旅(81)

    当进程A权限较低,而B权限较高时,容易产生提权漏洞 fuzz测试的测试路径 First level Interface是服务 Second level Interface是服务中对应的接口 1.首先获 ...

  7. Obj-C中内存的管理一瞥

    注意,ARC仅仅(自动)释放你手工管理的Objective-C类实例的内存, 但是不会释放由C函数或者Core Foundation(Cocoa的底层,C语言的变体)申请的内存.

  8. Sample Code for Qp_preq_pub.Price_request Api to Simulate an Ask for Promotion Modifier

    DECLARE p_line_tbl QP_PREQ_GRP.LINE_TBL_TYPE; p_qual_tbl QP_PREQ_GRP.QUAL_TBL_TYPE; p_line_attr_tbl ...

  9. Android开发技巧——实现可复用的ActionSheet菜单

    在上一篇<Android开发技巧--使用Dialog实现仿QQ的ActionSheet菜单>中,讲了这种菜单的实现过程,接下来将把它改成一个可复用的控件库. 本文原创,转载请注明出处: h ...

  10. MongoDB 3.0新增特性一览

    转自:http://blog.sina.com.cn/s/blog_48c95a190102vedr.html 引言 在历经版本号修改(2.8版本直接跳到3.0版本)和11个rc版本之后,MongoD ...