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为你介绍如何改,每一步是什么作用。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐