-
-
[原创]cython学习
-
发表于:
2025-12-15 22:03
913
-
是什么
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 2 3 4 5 6 7 8 9 10 | cpdef long sum(long n):
cdef long i
cdef long total = 0
for i in range(n):
total += i
return total
|
- setup.py
告诉python如何把 .pyx 编译成 .pyd 动态库
1 2 3 4 5 6 | from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("test_cy.pyx")
)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import time
import test_cy
N = 100000000
print("下面是纯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_cy
n = 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里面的,写的很详细,这里就不再写一遍了
ffcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4K6N6r3W2U0i4K6u0V1N6r3W2J5k6g2)9J5k6r3f1#2z5q4)9J5k6h3&6G2N6r3W2G2L8W2)9J5k6i4y4A6N6r3g2Q4x3V1k6U0P5i4c8Z5L8$3&6Q4x3X3b7J5j5K6W2U0j5e0b7#2k6h3p5^5j5e0b7^5x3r3j5I4j5X3b7H3y4$3j5K6k6r3t1I4x3X3j5&6y4K6V1J5x3R3`.`.
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!