Cython学习
本文按照工具书逻辑罗列了Cython语法,并总结了我工作中的编程经验。对于一些常见问题给出了一些”非专业“解决办法(不知道为啥能解决,但是能解决)。由于不是科班出身,班门弄斧还请见谅,大佬们发现啥错误欢迎在下方评论,不定期修改,不定期增加内容。下面进入主题:
Cython:疑问篇
问题一:为什么要用Cython
-
Python编写数值计算程序用到了大量**for-loop,**并且这些loop无法用数组型语法替代(即不能通过Numpy、Cuda等库提升速度)。
-
为什么不考虑使用pypy和numba?
在我做过的测试中,pypy的性能提升弱于精心编写的Cython程序,并且对开源库支持有限(如Numpy、Matplotlib)。Cython一次编译完可重复使用。(暂不清楚有没有预先编译好的功能)
-
**为什么不考虑用C和C++编写好模块然后用python调用?**答案–>时间成本。如果没学过这两个语言且没有编程基础,解决问题的大部分时间都会花在语言上。C和C++各有优势,C倾向于过程,C++倾向于对象,而cython既能实现过程加速也能用类python语法完胜面向对象编程。(当然在一些细枝末节的事上,Cython肯定比不上C和C++)
问题二:使用Cython要储备好哪些知识
- 如果只会Python一门编程语言,不建议直接用Cython,不然很多问题没有解决思路(当然如果你能耐心看完这篇文章可以省很多事)。较好的顺序是先看C基础(至少看完循环、条件分支与函数),然后学习Cython,这样应用时的效率会高很多。
Cython:编译流程(Mac os)
- 在项目文件夹下新建一个后缀名为.pyx的文件即Cython文件,如果有写好的python代码可以把代码先复制过去。
- 在项目文件夹下新建一个名为setup.py的python文件,在里面敲好如下代码:
import numpy as np
# 不用numpy不加这行
from distutils.core import setup
# 必须部分
from distutils.extension import Extension
# 必须部分
from Cython.Distutils import build_ext
# 必须部分
ext_modules = [Extension("filename", ["filename.pyx"], include_dirs=[np.get_include()]),]