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 ...
随机推荐
- 一键安装gitlab7在rehl6.4上
一键安装gitlab7在rehl6.4上 参考原文: http://blog.csdn.net/ubuntu64fan/article/details/38367579 1 关于gitlab7 无论如 ...
- Order Management Useful Scripts
Listed some useful queries scripts for Oracle Order Management Flow. (For Order Management Detailed ...
- python的exec
exec "一条python语句" 这样会执行python 语句.用于执行储存在字符串或文件中的Python语句. 当然 也可以 用 exec(str)这种方式, 总之一句话,尽量 ...
- 【Linux 操作系统】Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
. : 关机, 如果将Linux默认运行等级设置为0, 系统将无法启动; -- : 多用户模式, 允许使用网络文件系统, 一般不使用图形界面登陆就是这种模式; -- : 多用户图形界面模式, 该模式下 ...
- Web service request SetParameters to Report Server http://host/reportserver failed. Error: 请求因 HTTP 状态 401 失败: Unauthorized
迁移CRM服务器完成后在访问CRM的内部报表时报错,在查看应用服务器的日志时发现报"Web service request SetParameters to Report Server ht ...
- "《算法导论》之‘树’":二叉查找树
树的介绍部分摘取自博文二叉查找树(一).二叉查找树(二).二叉查找树. 1. 树的介绍 1.1 树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 把它叫做“ ...
- RecyclerView 实现gallery画廊效果
1.RecyclerView的基本用法 首先主Activity的布局文件: [html] view plaincopy <RelativeLayout xmlns:android="h ...
- OpenCV kmeans代码
代码:出处忘了 // // Example 13-1. Using K-means // // /* *************** License:************************* ...
- HBase丢失数据的故障和原因分析
hbase的稳定性是近期社区的重要关注点,毕竟稳定的系统才能被推广开来,这里有几次稳定性故障和大家分享. 第一次生产故障的现象及原因 现象: 1 hbase发现无法写入 2 通过hbc ...
- LeetCode(30)-Pascal's Triangle
题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, ...