在python中使用c语言
1.前言
工作以后一直做AI领域的研究,python在数据处理上我一直感觉很麻烦,尤其是一直扎根在底层上,对pyhton的数据架构感觉很不习惯,尤其是最近做一个比赛,就是数据清洗的项目。于是还是想把c语言的特性融入python里,于是大概研究了一下怎么使用。
网上常见的是将c转变为dll文件,但是dll文件带来的开销非常大,在少量使用时特点不明显,而使用c的地方恰恰是数据大量交换的点,这不相互矛盾吗?后来发现还有另一种方法,使用cython,可以直接将c文件当做库文件嵌入pyhton里使用,效率很高。
2.环境
我的python版本是3.13,开发环境是pycharm
python这边我们需要安装有两个软件包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.py
from setuptools import setup, Extension
from Cython.Build import cythonize
import os
# 1. 定义扩展模块(核心配置)
ext_modules = [
Extension(
name="calc_module", # 编译后生成的模块名(Python导入用这个名字)
sources=["calc_wrapper.pyx", "calc.c"], # 要编译的文件(Cython+C)
compiler_directives={"language_level": "3"}, # 适配Python3
extra_compile_args=["-O2"], # 编译优化(可选)
)
]
# 2. 执行编译
setup(
name="calc_module",
ext_modules=cythonize(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语言,我现在的环境是windows+pycharm,介绍cython方法
大家有更大的需要可以直接让AI为你介绍如何改,每一步是什么作用。
更多推荐



所有评论(0)