-
-
[原创]cython学习
-
发表于: 4天前 148
-
是什么
Cython 是一种编程语言,它是 Python 的超集(Superset)。简单来说,它的目标是让你用写 Python 的语法,获得写 C 语言的性能。
它主要有两个核心用途:
- 提升运行速度:通过给变量加上静态类型(Static Typing),将 Python 代码编译成 C 代码,从而大幅提升计算密集型任务的效率(有时能快几十倍甚至上百倍)。
- 调用 C/C++ 库:它是 Python 与 C/C++ 交互最方便的桥梁之一,很多高性能库(如 Pandas, NumPy, Scikit-learn)底层都大量使用了 Cython。
Cython 的核心原理
当你写好一段 Cython 代码(通常保存为 .pyx 文件)后,工作流程如下:
- Cython 编译器 将
.pyx代码翻译成.c代码。 - C 编译器(如 GCC 或 MSVC)将
.c代码编译成共享库(Windows 上是.pyd,Linux/Mac 上是.so)。 - Python 解释器 可以直接
import这个共享库,就像导入普通 Python 模块一样。
如何使用
举个累加的例子
安装cython
1 | pip install cython |
新建一个文件夹,然后建立三个文件
- test.pyc
1 2 3 4 5 6 7 8 9 10 | # cpdef声明c和python都可以调用# cdef声明该变量为c类型cpdef long sum(long n): cdef long i cdef long total = 0 # 纯C级别的循环 for i in range(n): total += i return total |
- setup.py
告诉python如何把 .pyx 编译成 .pyd 动态库
1 2 3 4 5 6 | from setuptools import setupfrom Cython.Build import cythonizesetup( ext_modules = cythonize("test_cy.pyx")) |
- main.py
调用动态库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import timeimport test_cyN = 100000000print("下面是纯Python的累加计算")print("开始计算0到", N, "的累加")start = time.time()result = sum(range(N))end = time.time()print(f"耗时: {end - start:.4f} 秒\n\n")print("下面是cython加速的累加计算")print("开始计算0到", N, "的累加")start = time.time()result = test_cy.sum(N)end = time.time()print(f"耗时: {end - start:.4f} 秒") |
打开终端,先进行pyx的编译
1 | python setup.py build_ext --inplace |
- build_ext:构建扩展模块
- —inplace:生成的编译文件放在当前的目录下
编译成功如下:

生成:

- 然后运行 main.py即可,结果如下:

可以发现加快了许多
调试
参考: https://bbs.kanxue.com/thread-285349.htm
ida9.0pro,conda-python3.12
讲解就针对上面的累加代码来调试
写代码调用pyd
先写一个 ida.py 来调用pyd模块
1 2 3 | import test_cyn = input()print(test_cy.sum(int(n))) |
这里增加一个input,一是程序会让我们输入东西,二是方便我们attach这个进程
运行即可,但是先别输入
ida attach python进程
先将pyd文件拖到ida反编译,然后:

选择运行ida.py的python.exe即可:

.text下断点
运行肯定是从.text段开始的,我们可以直接在这个段的开头下断点

F9后,在终端输入数字,RIP就会跳到这里

随后正常分析,然后调试即可,其实也可以先静态看一看,pyd扩展里面的sum函数具体实现在哪,也可以跳到那里看看,比如这里:

例题
两个2024ciscn题目 rand0m , cython
具体可以看我写在notion里面的,写的很详细,这里就不再写一遍了
fdcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6U0P5i4c8Z5L8$3&6Q4x3X3b7J5j5K6W2U0j5e0b7#2k6h3p5^5j5e0b7^5x3r3j5I4j5X3b7H3y4$3j5K6k6r3t1I4x3X3j5&6y4K6V1J5x3R3`.`.