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")
Cython入门Demo(Linux)的更多相关文章
- 【SSH系列】初识spring+入门demo
学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...
- 基于springboot构建dubbo的入门demo
之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...
- apollo入门demo实战(二)
1. apollo入门demo实战(二) 1.1. 下载demo 从下列地址下载官方脚本和官方代码 https://github.com/nobodyiam/apollo-build-scripts ...
- lua入门demo(HelloWorld+redis读取)
1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ...
- netty入门demo(一)
目录 前言 正文 代码部分 服务端 客服端 测试结果一: 解决粘包,拆包的问题 总结 前言 最近做一个项目: 大概需求: 多个温度传感器不断向java服务发送温度数据,该传感器采用socket发送数据 ...
- canal入门Demo
关于canal具体的原理,以及应用场景,可以参考开发文档:https://github.com/alibaba/canal 下面给出canal的入门Demo (一)部署canal服务器 可以参考官方文 ...
- 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 ...
- SpringBoot 入门 Demo
SpringBoot 入门 Demo Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从 ...
- ReactJs 入门DEMO(转自别人)
附件是分享的一些他人的ReactJs入门DEMO,以前版本使用的是JSXTransformer.js,新版的用browser.min.js替代了. DEMO 下载地址:http://files.cnb ...
随机推荐
- linux,shell脚本set -x的意思
set -x a=10 命令执行结果: + a=10 echo $a + echo 10 10 set指令能设置所使用shell的执行方式,可依照不同的需求来做设置 -a 标示已修改的变量,以供输出至 ...
- OC学习之道:关于Block的初级学习
[objc] view plaincopy "code" class="OC"> // // main.m // Copyright (c) 2015 ...
- 4.6、Libgdx线程介绍
(原文:http://www.libgdx.cn/topic/48/4-6-libgdx%E7%BA%BF%E7%A8%8B%E4%BB%8B%E7%BB%8D) 所有的ApplicationList ...
- 【一天一道LeetCode】#29. Divide Two Integers
一天一道LeetCode系列 (一)题目 Divide two integers without using multiplication, division and mod operator. If ...
- 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...
- Java-GenricServlet
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable { priva ...
- Zeroc Ice开发环境搭建
搭建Ice环境 1. Linux(推荐,更接近真实生产环境) 2. Windows(方便学习开发) 下载安装包:https://zeroc.com/downloads (百度网盘链接:http ...
- 关于UIView用户交互相关的属性和方法
UIView除了负责展示内容给用户外还负责响应用户事件 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除 ...
- LeetCode(40)-Merge Sorted Array
听到初爱有感 开头啰嗦两句,刚在做算法题目的时候,听到了杨宗纬的<初爱>,突然有了一种本科时候的感觉,想想自己现在研二了,青春喂了狗,我果断喝了一罐啤酒,循环这首歌到吐-.. 题目: Gi ...
- Mac Finder 里新建文本
Mac Finder 里新建文本 首先吐槽下 Mac 的文件管理 Finder 真的是太弱了,之前没感觉 Windows 的资源管理器多厉害,但是和 Mac 的比起来真是堪称神器啊,果然牛逼与否还的看 ...