当你把 Python 学透之后,你会发现速度远不如 C,所以,不想学 C 的读者们,来学学这个cython.
在此之前,我们要安装:
Cython,visual studio build tools或者minGW
所以可以执行下面终端命令:
python -m pip install cython
然后编译器的话,可以去官网安装,如果不是 Windows,可以使用sudo和brew和apt。
好了之后,就可以开始了,cython的文件后缀名是.pyx,编译结果是.pyd,编译结果就是底层 C 扩展库,Python 里面的 OS模块就是os.pyd,今天我们就能做一个这样的模块。
因为编辑器极其少,所以直接使用文本编辑器(macOS and Linux)记事本(Windows),first.pyx:
cpdef int firstf(int a,int b):
print('hello')
return a+b
我来解释一下:首先cpdef 定义一个C 内部加速,Python 调用,就是同时让 C 和 P 都能调用。
然后那个 int,是 C 里面的整数类型声明符,然后int a,int b也是 C 类型声明.
然后能编译了:
不想写或不懂setup.py的读者可以直接运行
python -m cythonize -i first.pyx
这个终端命令。
执行完之后,同文件夹下多了一个文件,那就是编译好的 PYD 文件,注意 千万不要改名,后面的一大串版本号要先看清再去掉。比如说如果看到里面有cp311这样的,就表示只有在CPython 3.11中才能使用。cpython 就是标准的 Python,举个例子,你从 Python 官网下载的就是标准的 cPython,在 Windows 中,CPython的文件名一般会如下:
python.exe
python3.exe
python3.11.exe
在PyCharm或者 VSCode中,然后在运行栏显示解释器名称。
注意这个 Python不能是从应用商店下载的,必须从官网下载才能正常使用xxx-cp3xx-xxxxxxxx.pyd文件。
编译完就可以使用了。
在 PYD 文件的同一目录下,新建一个test.py,代码如下:
import first
print(first.firstf(1,4))
运行之后能看到
hello
5
表明正常。
Cython的语法和 Python 有区别,接下来再学习。
def&cdef&cpdef
三个似乎都是定义,有什么区别?
def:Python 关键字,定义函数
cdef:Cython关键字,定义C变量函数类,Python不可调用
cpdef :cython关键字,定义Python可调用函数类,c内部可调用,同时有内部加速,也可以外部调用。
cdef,cpdef:
cdef xxx:定义一个 C 的变量、函数或类,语法如下:
(函数)cdef 标识符 函数(参数)
(声明变量)cdef 标识符 变量
(类)cdef class xxxxx
大概就是这样。
另一个差不多,只是一个给内部调用 一个给外部调用,并且底层 C 加速。
cimport
导入一个cython模块,可以是标准模块,也可以是一个.pxd文件。
举个例子:
a.pxd
print('test')
b.pyx
cimport a
上面的那个命令,可以导入a模块。官方内置了一些pxd模块,比如cmath,stdlib,string等等。
学了 C 之后来学也会更好。
下次学习更好的编译,setup.py