首页
社区
课程
招聘
[原创]cython学习
发表于: 4天前 148

[原创]cython学习

4天前
148

是什么

Cython 是一种编程语言,它是 Python 的超集(Superset)。简单来说,它的目标是让你用写 Python 的语法,获得写 C 语言的性能

它主要有两个核心用途:

  1. 提升运行速度:通过给变量加上静态类型(Static Typing),将 Python 代码编译成 C 代码,从而大幅提升计算密集型任务的效率(有时能快几十倍甚至上百倍)。
  2. 调用 C/C++ 库:它是 Python 与 C/C++ 交互最方便的桥梁之一,很多高性能库(如 Pandas, NumPy, Scikit-learn)底层都大量使用了 Cython。

Cython 的核心原理

当你写好一段 Cython 代码(通常保存为 .pyx 文件)后,工作流程如下:

  1. Cython 编译器.pyx 代码翻译成 .c 代码。
  2. C 编译器(如 GCC 或 MSVC)将 .c 代码编译成共享库(Windows 上是 .pyd,Linux/Mac 上是 .so)。
  3. 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 setup
from Cython.Build import cythonize
 
setup(
    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 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即可,结果如下:
    运行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
选择运行ida.py的python.exe即可:
attach

.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`.`.


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回