1.前言工作以后一直做AI领域的研究python在数据处理上我一直感觉很麻烦尤其是一直扎根在底层上对pyhton的数据架构感觉很不习惯尤其是最近做一个比赛就是数据清洗的项目。于是还是想把c语言的特性融入python里于是大概研究了一下怎么使用。网上常见的是将c转变为dll文件但是dll文件带来的开销非常大在少量使用时特点不明显而使用c的地方恰恰是数据大量交换的点这不相互矛盾吗后来发现还有另一种方法使用cython可以直接将c文件当做库文件嵌入pyhton里使用效率很高。2.环境我的python版本是3.13开发环境是pycharmpython这边我们需要安装有两个软件包cython和setuptools我们先下载MinGW-w64这是在windows下可以使用gcc的软件到官网下选择download选择这个项目然后跳转到github选择这个压缩包是win10和11的解压后是一个文件夹不要动里面的东西直接把整个文件夹找个合适的地方放即可之后我们需要配置环境变量选择用户环境变量的Path将刚刚的解压的文件夹下的bin文件夹放到环境变量里因为bin里面有gcc的编译器没有问题后我们打开电脑的终端输入gcc --version显示版本号就算安装完毕了3.C文件首先我们先写calc.c文件简单写一个阶乘#include calc.h // 加法实现 int add(int a, int b) { return a b; } // 阶乘实现 long long factorial(int n) { if (n 0) return -1; // 负数返回-1后续Python层封装异常 long long result 1; for (int i 1; i n; i) { result * i; } return result; }之后写一下头文件calc.h#ifndef CALC_H #define CALC_H // 加法函数 int add(int a, int b); // 阶乘函数 long long factorial(int n); #endif之后我们还需要写桥接文件命名为calc_wrapper.pyx# 声明要调用的C函数从calc.h导入 cdef extern from calc.h: int add(int a, int b) long long factorial(int n) # 封装为Python可调用的函数添加异常处理更符合Python习惯 def py_add(int a, int b): Python封装的加法函数 return add(a, b) def py_factorial(int n): Python封装的阶乘函数添加负数校验 if n 0: raise ValueError(n 必须是非负数) return factorial(n)之后编写编译配置文件 setup.pyfrom setuptools import setup, Extension from Cython.Build import cythonize import os # 1. 定义扩展模块核心配置 ext_modules [ Extension( namecalc_module, # 编译后生成的模块名Python导入用这个名字 sources[calc_wrapper.pyx, calc.c], # 要编译的文件CythonC compiler_directives{language_level: 3}, # 适配Python3 extra_compile_args[-O2], # 编译优化可选 ) ] # 2. 执行编译 setup( namecalc_module, ext_modulescythonize(ext_modules), # cythonize处理Cython文件 )把所有文件都放到pycharm工程下面4.编译之后我们开始编译在命令行里写入命令开始编译python setup.py build_ext --inplace这里有可能会报错“error:microsoft visual c 14.0 or greater is required”这里需要去visual studio安装环境勾选上c桌面开发选择msv v143这个选项其他的不重要全部搞定了再次编译成功后会多出两个文件5.python调用简单写一个测试文件# 导入编译后的扩展模块 import calc_module # 调用加法函数 print(2 3 , calc_module.py_add(2, 3)) # 输出2 3 5 # 调用阶乘函数 print(5! , calc_module.py_factorial(5)) # 输出5! 120 # 测试异常负数阶乘 try: calc_module.py_factorial(-1) except ValueError as e: print(异常, e) # 输出异常n 必须是非负数搞定6.结束语这次实验我结合了大模型以及网上的资料我喂给豆包的提示词如下如何在python使用c语言我现在的环境是windowspycharm介绍cython方法大家有更大的需要可以直接让AI为你介绍如何改每一步是什么作用。