news 2026/4/18 0:09:20

Day 69:【99天精通Python】C/C++ 扩展 (CTypes/Cython) - 给 Python 装上喷气引擎

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 69:【99天精通Python】C/C++ 扩展 (CTypes/Cython) - 给 Python 装上喷气引擎

Day 69:【99天精通Python】C/C++ 扩展 (CTypes/Cython) - 给 Python 装上喷气引擎

前言

欢迎来到第69天!

Python 的优点是开发效率极高,但缺点也很明显:运行速度慢(相比 C/C++)。
在绝大多数场景下,NumPy 和 Pandas 已经足够快了。但如果你遇到了某些极端的计算瓶颈(例如三重循环处理图像像素、复杂的加密算法),纯 Python 代码可能会慢得让你怀疑人生。

这时候,我们有两种选择:

  1. CTypes:直接调用已经编译好的 C 动态链接库 (.dll.so)。
  2. Cython:写一种类似 Python 的代码,然后自动编译成 C 扩展模块。

今天,我们就来学习如何用 C 语言给 Python 加速。

本节内容:

  • CTypes:调用 C 语言编写的动态库
  • Cython:将 Python 代码编译为 C
  • 编写 setup.py 编译扩展
  • 性能对比:Python vs CTypes vs Cython

一、CTypes:借力打力

CTypes 是 Python 内置的库,它可以加载动态链接库。

1.1 编写 C 代码 (math_lib.c)

我们需要先写一段 C 代码,实现一个计算斐波那契数列的函数(递归版,非常耗时)。

// math_lib.c#include<stdio.h>// 递归计算斐波那契longlongfib(intn){if(n<=1)returnn;returnfib(n-1)+fib(n-2);}// 一个简单的加法intadd(inta,intb){returna+b;}

1.2 编译为共享库

在终端执行(需要安装 gcc):

  • Linux/Mac:
    gcc -shared -o math_lib.so -fPIC math_lib.c
  • Windows (MinGW):
    gcc -shared -o math_lib.dll math_lib.c

1.3 Python 调用

importctypesimportosimporttime# 加载动态库lib_path=os.path.abspath("./math_lib.so")# Windows用 .dllclib=ctypes.CDLL(lib_path)# 配置参数和返回值类型 (C语言是强类型的)clib.fib.argtypes=[ctypes.c_int]clib.fib.restype=ctypes.c_longlong# 调用 C 函数start=time.time()print(f"Fib(35) ={clib.fib(35)}")print(f"C 耗时:{time.time()-start:.4f}秒")# 对比 Python 原生defpy_fib(n):ifn<=1:returnnreturnpy_fib(n-1)+py_fib(n-2)start=time.time()print(f"Py Fib(35) ={py_fib(35)}")print(f"Python 耗时:{time.time()-start:.4f}秒")

实测结果:C 版本通常比 Python 版本快 50-100 倍!


二、Cython:披着 Python 皮的 C

CTypes 需要你会写 C 语言。而Cython允许你写 Python 代码,然后把它翻译成 C 代码并编译。

安装:

pipinstallcython

2.1 编写 Cython 代码 (hello.pyx)

新建文件hello.pyx。代码看起来和 Python 几乎一样,只是增加了类型声明。

# hello.pyx# 纯 Python 写法defpy_fib(n):ifn<=1:returnnreturnpy_fib(n-1)+py_fib(n-2)# Cython 写法 (cpdef 定义 C 函数)# int n: 指定类型cpdeflonglongcy_fib(intn):ifn<=1:returnnreturncy_fib(n-1)+cy_fib(n-2)

2.2 编写编译脚本 (setup.py)

为了让 Python 能 import 这个.pyx文件,我们需要把它编译成二进制扩展模块 (.pyd.so)。

# setup.pyfromsetuptoolsimportsetupfromCython.Buildimportcythonize setup(ext_modules=cythonize("hello.pyx"))

2.3 编译

在终端运行:

python setup.py build_ext --inplace

运行后,你会发现目录下生成了一个.c文件和一个.so(或.pyd) 文件。

2.4 调用扩展

新建main.py

importhelloimporttime start=time.time()print(f"Cython Fib:{hello.cy_fib(35)}")print(f"耗时:{time.time()-start:.4f}秒")

Cython 的魔力:哪怕你完全不改代码,只是用 Cython 编译一下 Python 源码,通常也能获得 30% 的性能提升。如果你加上了类型声明(cdef int a),性能可以媲美原生 C。


三、性能对比总结

我们用斐波那契数列计算 (n=35) 来对比三种方式:

方式耗时 (约)评价
Python4.0 秒解释执行,动态类型检查,慢。
CTypes0.08 秒直接执行机器码,极快,但需要写 C。
Cython0.09 秒编译为 C 后执行,极快,开发效率高。

四、常见问题

Q1:什么时候用 CTypes,什么时候用 Cython?

  • 如果你已经有一个现成的 C/C++ 库(如 OpenCV, FFmpeg),只想调用它的功能,用CTypes
  • 如果你是想加速自己的 Python 算法,且不想写 C 代码,用Cython

Q2:Cython 里的def,cdef,cpdef区别?

  • def: Python 函数,Python 可调用,慢。
  • cdef: C 函数,只有 Cython 内部可调用,极快。
  • cpdef: 混合体,Python 可调用(会自动生成 wrapper),也快。

Q3:编译报错Unable to find vcvarsall.bat(Windows)?

Cython 编译需要 C 编译器。Windows 用户需要安装Visual Studio Build Tools(勾选 C++ 开发环境)。


五、小结

Python 加速

CTypes

Cython

加载 .so/.dll

ctypes.CDLL()

需手动管理类型

编写 .pyx

setup.py build_ext

静态类型 (cdef int)

关键要点

  1. Python 慢是因为它是动态解释型语言。
  2. CTypes是连接 Python 和 C 的桥梁。
  3. Cython是让 Python 变身为 C 的魔法棒。
  4. 在性能敏感的循环中,加上类型声明 (cdef) 是提速的关键。

六、课后作业

  1. 素数计算加速:回顾 Day 25 的素数计算任务。尝试用 Cython 重写is_prime函数,加上类型声明,编译后对比纯 Python 的速度。
  2. 调用 C 库:编写一个简单的 C 函数void say_hello(char* name),编译为动态库,并用ctypes在 Python 中调用它。
  3. 数组求和:用 Cython 编写一个函数,接收一个 Python 列表,将其转换为 C 数组并求和。(提示:使用 Cython 的 Memoryview 或者是与 NumPy 集成)。

下节预告

Day 70:实战篇总结与项目复盘- 我们的实战篇(Day 46-69)即将结束。明天我们将对这 24 天学习的数据分析、Web 开发、自动化运维技能进行全面复盘,并展望最高阶的项目篇


系列导航

  • 上一篇:Day 68 - 设计模式下
  • 下一篇:Day 70 - 实战篇总结(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 21:08:47

Llama3-8B定时任务处理?Cron调度实战案例

Llama3-8B定时任务处理&#xff1f;Cron调度实战案例 1. 引言&#xff1a;从本地大模型部署到自动化调度的演进 随着大语言模型&#xff08;LLM&#xff09;在企业与个人场景中的广泛应用&#xff0c;如何将模型推理能力集成到日常自动化流程中&#xff0c;成为提升效率的关键…

作者头像 李华
网站建设 2026/4/18 5:32:46

AI读脸术生态整合:与OCR、行为分析系统联动案例

AI读脸术生态整合&#xff1a;与OCR、行为分析系统联动案例 1. 引言 随着计算机视觉技术的不断演进&#xff0c;AI对人脸信息的理解已从“识别是谁”迈向“理解特征与行为”的新阶段。在安防、零售、智能交互等场景中&#xff0c;仅靠人脸识别身份已无法满足精细化运营需求。…

作者头像 李华
网站建设 2026/4/18 5:19:32

YOLOv13镜像部署全流程:适合新手的详细步骤

YOLOv13镜像部署全流程&#xff1a;适合新手的详细步骤 在智能制造、自动驾驶和智能安防等实时视觉系统中&#xff0c;目标检测模型的部署效率直接决定了项目的落地速度。传统部署方式常因环境依赖复杂、版本冲突频发而耗费大量调试时间。如今&#xff0c;随着 YOLOv13 官版镜…

作者头像 李华
网站建设 2026/4/18 8:07:59

亲自动手试了gpt-oss,结果让我大吃一惊

亲自动手试了gpt-oss&#xff0c;结果让我大吃一惊 1. 引言&#xff1a;从开源到本地推理的跨越 OpenAI 最近发布了其首个开放权重的大语言模型 gpt-oss&#xff0c;这一举动在AI社区引发了广泛关注。对于开发者和研究者而言&#xff0c;这意味着我们终于可以合法地在本地环境…

作者头像 李华
网站建设 2026/4/18 7:35:14

Qwen3-Reranker-4B应用开发:实时搜索服务架构设计

Qwen3-Reranker-4B应用开发&#xff1a;实时搜索服务架构设计 1. 引言 随着信息检索系统对精度和效率要求的不断提升&#xff0c;传统基于向量相似度的初检结果已难以满足复杂场景下的排序需求。重排序&#xff08;Re-ranking&#xff09;作为提升搜索质量的关键环节&#xf…

作者头像 李华
网站建设 2026/4/18 7:56:09

FSMN-VAD模型切换:多语言VAD适配可能性探讨

FSMN-VAD模型切换&#xff1a;多语言VAD适配可能性探讨 1. 引言 1.1 语音端点检测的技术背景 语音端点检测&#xff08;Voice Activity Detection, VAD&#xff09;是语音信号处理中的基础模块&#xff0c;其核心任务是从连续音频流中准确识别出有效语音段的起止时间&#x…

作者头像 李华