首先和大家明确一下这个Cython单词的读法,这个单词Cython以前我也不知道怎么读,老后面要用到这个包的时候,老是不清楚读法,才去搜了下,这个单词是读"赛森",就是前面的cy是读"赛",后面的读法和python后一个读音thon一样。
Cython是什么
Cython是一个用于将Python代码转换为C或C++代码的编译器。Cython能够将Python和C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库。它允许充分发挥c语言性能的优势,同时仍然可以利用Python的简洁和易用性。Cython是一个独立的项目,并不是Python的标准库,可以通过安装Cython
包来使用它。
使用Cython可以将Python代码转换成C或C++,进而编译成机器码。这样一来,借助Cython,可以在不改变太多代码的情况下,大大提高Python程序的运行度。Cython还提供了一些特性,如声明静态类型、直接调用C函数等,一步提升性能。
要安装Cython包,可以使用Python的包管理器(如pip)在命令行中运行以下命令:
pip install Cython
安装完成后就可以在Python代码中使用Cython来编译优化。常见的用例包括编写高性能的数值计算库、C/C++的接口协议等。
当您使用Cython将Python代码转换为C或C++代码时,需要将Python代码中的一些部分注为Cython特定类型注释,以告诉Cython如何将其转换为相应的C或C++代码。
如何使用Cython
使用Cython有一定的规则,不可以随便使用,以下是一个简单的示例,演示如何使用Cython将Python代码转换C代码:
- 创建一个名为
example.pyx
的文件,包含以下代码:
python
def add_numbers(a, b):
return a + b
- 然后你需要在相同目录下创建一个名为
setup.py
的文件,包含以下代码:
python
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("example.pyx"))
- 然后进入包含
example.pyx
和setup.py
文件的目录,运行以下命令:
bash
python setup.py build_ext
然后就会你当前目录下生成一个example.c
的C文件。可以在文件中看到Cython将代码转换为的C。这个生成的里面代码比较多,也比较复杂,当然核心代码就是实现就是实现pyx文件中的功能。如果你有观察当前目录的话,你会发现有个build目录生成。build目录下面就有example相关的so文件生成。
我们验证一下是否是如此
python
Python 3.7.9 (default, Apr 26 2023, 09:00:47)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> example.add_numbers(100, 200)
300
>>>
当然你也可以讲生成的c文件自己编译成so文件,通过以下编译命令就可以生成example.so的动态链接库
bash
gcc -fPIC -c example.c -o example.o -I/usr/include/python3.7m/ -lpython3.7
gcc -shared -o example.so example.o
也就是说你用example的python代码写了一个接口,然后通过cython转成c代码编译成了so文件,也就相当于你既拥有了python语言的快速开发,又有了c语言的性能,这个就是cython的强大之处。
通过这种方式,可以将Python代码转换为C或C++代码,并通过编译器将其进一步编译成机器码。Cython提供了许多优化选和类型声明,可以进一步提高生成的C代码的性能。当然这只是一个非常非常简单示例,实际使用肯定比这个复杂的多,更多关于Cython的详细信息可以去Cython的官方社区了解。
pyx文件是啥
后缀为.pyx
的文件是Cython的源代码文件,而不是Python的源代码文件。它将用于扩展Python的代码转换为C或C++代码,以提供更高的性能。.pyx
文件包含了Cython编写的代码,其中可以包含Python代码和ython特定的语法。
Cython的源码文件使用.pyx
作为文件后缀,以明确识这是Cython的文件,而不是普通的Python代码文件。反正就是pyx是兼容python的代码的,让你既拥有了python语言的快速开发,又有了c语言的性能。