1. Overview

Cython是个编程语言,Cython帮助你像写python一样写C的扩充代码,官方画大饼说想要把Cython变成python的增强版本。Cython能把c, c啪啪编译好当作python模块来import, 好处是速度快并且我们可以重用一些C的代码库。这其实挺有意思的,让我们可以同时写python和写C。毕竟之前python代码虽然底层实现是C代码(Cpython运行环境和pyrex库了解一下),但是以前程序员在上层感受不到C的存在,也无法对C进行编程。按照人家的文档所说 “Cython thus merges the two worlds into a very broadly applicable programming language”.

2. 安装

需要提前安装gcc,如何安装gcc,不同操作系统请八仙过海。然后直接pip install Cython

3. Cython搭建过程

Cython需要编译,才能在python里面import。Cython文件本身是pyx或py后缀,需要先编译成c后缀,然后再从c后缀编译成so或者pyd (跟操作系统相关) 后缀才能import。
编译过程需要使用setuptools这个包,有多种使用setuptools编译Cython的方法:

  • 写一个setup外部脚本编译,可以根据项目批处理,可扩展能力最强,正经操作
  • 也可以为单独文件运行cythonize -i xxx.pyx,最灵活
  • 也可以用封装了setuptools的Pyximport包,官方不太推荐
  • 全手动自己搞(我也不知道怎么搞)
  • jupyter提供inline模式,反正就是jupyter帮你搞了编译过程,你无脑跑代码就行,最简单

setup.py文件就像下面这么写

from setuptools import setup
from Cython.Build import cythonizesetup(name='Hello world app',ext_modules=cythonize("hello.pyx"),zip_safe=False,
)

然后直接运行python setup.py build_ext --inplace

jupyter就按照下面这么用。

4. 让你的代码更快更强

4.1. 定义Cython变量

首先了解Cython变量声明,有两种方式:第一种是用Cython特有的cdef,另外一种是基于python代码来创建Cython变量。并且所有C类型都支持,并且在赋值的时候cdef会自动的适配对应的类型。下面来看两对积分代码,分别基于两种方式:

# python 旧风格
def f(x: cython.double):return x ** 2 - xdef integrate_f(a: cython.double, b: cython.double, N: cython.int):i: cython.ints: cython.doubledx: cython.doubles = 0dx = (b - a) / Nfor i in range(N):s += f(a + i * dx)return s * dx
# cython新风格
def f(double x):return x ** 2 - xdef integrate_f(double a, double b, int N):cdef int icdef double scdef double dxs = 0dx = (b - a) / Nfor i in range(N):s += f(a + i * dx)return s * dx

可以看到首先是函数传参是有类型的,并且传入的参数和部分在函数中用到的变量是声明了cython的数据类型。两种代码不同指出就是cython更加简洁,且函数定义中的参数更像c的代码。(这里要学习注意的是如果想要让循环更快,别忘了给idx设定为cython类型。并且并不是函数中所有的变量都要变成cython变量,少几个性能影响不大,想知道什么变量需要转换成cython变量可以通过运行cython -a file来获得html分析报告)。

4.2. 定义Cython函数

这个不难,直接把函数的def f(),换成cdef double f()就行,语法上既相当于c语言中的返回值,且又定义了Cython的函数。注意的是,当把def变成cdef之后,python后面的代码就找不到这个c函数了,无法调用,解决办法是使用cpdef,相当于给这个Cython函数外面包了一层python wrapper,这样之后就又有高性能的计算速度,又能在python运行的时候找到并调用(所以说如果不想在python中调用这个函数就可以简单的使用cdef)。

有机会更新后面更深入的内容。。。

cython大白话基础教程相关推荐

  1. python 科学计算基础教程电子版-Python 科学计算基础 (整理)

    Python是一种面向对象的.动态的程序设计语言,具有非常简洁而清晰的语法,既可以用于快速开发程序脚本,也可以用于开发大规模的软件,特别适合于完成各种高层任务. 随着NumPy.SciPy.matpl ...

  2. 本征向量、PCA和熵的基础教程

    1. 简介 本页主要以通俗语言和少量数学公式介绍本征向量及其与矩阵之间的关系,并且在此基础上解释协方差.主成分分析和信息熵. 本征向量(eigenvector)一词中的"本征(eigen)& ...

  3. Java基础教程-05-面向对象

    Java基础教程-05-面向对象 1. 面向过程和面向对象解释 1.1 面向过程 1.1.1 简述 我们回想一下, 前面我们完成一个需求的步骤是怎样的? 首先是搞清楚我们要做什么. 然后在分析怎么做. ...

  4. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

  5. [SQL基础教程] 1-5 表的删除和更新

    [SQL基础教程] 1-5 表的删除和更新 表的删除 语法 DROP TABLE <表名>; 法则 1-12 删除的表无法恢复 表定义的更新 语法 ALTER TABLE<表名> ...

  6. python 包用法_Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...

  7. Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0

    Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0 昨晚Nacos社区发布了第一个生产级版本:0.8.0.由于该版本除了Bug修复之外,还提供了几个生产管理非常重要 ...

  8. Python培训基础教程都教哪些

    根据相关数据统计,目前学习Python技术的同学大多数是零基础,都是从其他行业转型来学习的,那么Python培训基础教程都教哪些呢?好不好学呢?来看看下面的详细介绍. Python培训基础教程都教哪些 ...

  9. 深度学习之Pytorch基础教程!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李祖贤,Datawhale高校群成员,深圳大学 随着深度学习的发展 ...

最新文章

  1. JAVA面试题系列:如何解决Redis的并发竞争问题
  2. ORACLE如何使用DBMS_METADATA.GET_DDL获取DDL语句
  3. 汽车维修保养记录php源码,汽车维修保养记录
  4. javascript学习-创建json对象数据,遍历
  5. 【转】Vector与ArrayList区别
  6. P3642 [APIO2016]烟火表演(左偏树、函数)
  7. 江民杀毒软件KV网络版反病毒整体解决方案──金融行业
  8. C++笔记-shared_ptr与weak_ptr需要注意的地方
  9. python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例
  10. 关于ConcurrentDictionary的线程安全
  11. uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据) (转)...
  12. [51nod1232]完美数
  13. 【python项目开发】爬虫基础知识
  14. matlab的实时编辑器介绍以及应用示例
  15. 微软苏州二期全面封顶,明年投入使用!三期开工时间已定,研发人才将达5000余人!...
  16. 传感器研究NO1.陀螺仪
  17. 树莓派计算模块CM4 eMMC系统烧写、配置、相机连接
  18. 华硕的电脑装linux系统安装教程,华硕笔记本电脑一键重装系统详细教程
  19. linux c语言lzma,LZMA 算法简介
  20. FTP传输大文件丢包损坏严重,怎么解决?

热门文章

  1. 蓝牙芯片NRF51822入门学习:时间管理
  2. SQL 2014新功能介绍系列3 - 备份还原篇
  3. 空闲时间不要接私活,要提升自己
  4. RocketMQ-01
  5. mosquitto 使用详解
  6. mosquitto基本使用
  7. mysqladmin的用法简介
  8. 因为未将计算机与远程服务,win7提示错误797未建立到远程访问服务的连接怎么办...
  9. C语言 打开文件时改变文件大小
  10. scum服务器 指定资源,SCUM服务器配置详解 参数设置推荐