众所周知,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. 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画

     1 关于常见的对话框,主要有: 常见的对话框,单选对话框,多选对话框,进度条对话框(转圈类型的),带进度条的对话框. 案例结构: 完成如下结构的案例,将所有的案例都测试一下: 2 编写MainA ...

  2. JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想

    JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...

  3. Linux grep命令分析以及C语言版本的实现

    1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...

  4. 放yy直播点赞动画

    最近在做直播相关的东西,这个动画是IOS先撸出来的,后来android这边要模仿,大部分直播应用都有很炫酷的点赞动画,所以也没什么好稀奇的.如果有现成的轮子了,就没必要自己再造了,后来参照了程序亦非猿 ...

  5. 对FMDB的封装JRDB

    在自己开发中,每次用到数据库都会纠结是使用CoreData还是FMDB.CoreData虽然Api简单,但是调用栈非常复杂,要初始化一个Context需要至少20行代码.显然,对于这种这么恶心的情况, ...

  6. 写论文如何做相关工作(realted work)的调研

    1.找一篇目标研究领域的中文综述,读懂,对该领域有了些基本的了解,如何找到好的综述,就是要关注一些大牛的实验组的综述和进展: 2.找该中文综述引用的外文文献来看,通常是一些比较经典的文献 3.找这些外 ...

  7. LIRe 源代码分析 7:算法类[以颜色布局为例]

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  8. Linux - vim按键说明

    第一部份:一般模式可用的按钮说明,光标移动.复制贴上.搜寻取代等 移动光标的方法 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑ ...

  9. DB Query Analyzer 6.02 is released, 71 articles concerned have been published

    DB Query Analyzer is presented by Master Genfeng, Ma from Chinese Mainland. It has English version n ...

  10. Stripe Compaction

    借鉴于LevelDB.Cassandra的Compaction方法,https://issues.apache.org/jira/browse/HBASE-7667 提出了Stripe Compact ...