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 - 实战篇总结(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单目深度估计实战:MiDaS模型部署与优化

单目深度估计实战&#xff1a;MiDaS模型部署与优化 1. 引言 1.1 技术背景 在计算机视觉领域&#xff0c;从单张二维图像中恢复三维空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件设备&#xff0c;成本高且部署复杂。随着深度学习的发展&#xff0…

效果展示:通义千问2.5-7B-Instruct打造的智能写作助手案例

效果展示&#xff1a;通义千问2.5-7B-Instruct打造的智能写作助手案例 1. 引言&#xff1a;为何选择通义千问2.5-7B-Instruct构建智能写作助手 在当前大模型快速发展的背景下&#xff0c;如何选择一个性能强、响应快、部署灵活且支持商用的开源模型&#xff0c;成为构建垂直领…

树莓派换源零基础指南:网络环境要求

树莓派换源实战指南&#xff1a;从卡顿到飞速的秘诀你有没有遇到过这种情况&#xff1a;刚入手树莓派&#xff0c;兴致勃勃地打开终端准备安装Python库或者升级系统&#xff0c;结果一条sudo apt update执行下去&#xff0c;半天不动&#xff0c;进度条像被冻住了一样&#xff…

CC2530零基础入门:串口下载与调试方式详解

CC2530入门实战&#xff1a;串口下载与调试全解析 你是不是也遇到过这种情况——手里的CC2530开发板接上电脑&#xff0c;打开烧录工具&#xff0c;结果提示“无法连接芯片”&#xff1f;反复检查线序、波特率、跳线&#xff0c;就是搞不定。别急&#xff0c;这几乎是每个ZigB…

IndexTTS2效果优化:语调、停顿、重音调节实战技巧

IndexTTS2效果优化&#xff1a;语调、停顿、重音调节实战技巧 1. 引言&#xff1a;提升语音自然度的关键挑战 随着AI语音合成技术的快速发展&#xff0c;用户对TTS&#xff08;Text-to-Speech&#xff09;系统的自然度和表现力提出了更高要求。尽管IndexTTS2在V23版本中显著增…

A.每日一题——2975. 移除栅栏得到的正方形田地的最大面积

题目链接&#xff1a;2975. 移除栅栏得到的正方形田地的最大面积&#xff08;中等&#xff09; 算法原理&#xff1a; 解法&#xff1a;暴力枚举 622ms击败78.57% 时间复杂度O(N) 此题跟上一题 A.每日一题——2943. 最大化网格图中正方形空洞的面积 的不同点&#x1f447; 空洞…

从语料到模型应用|StructBERT中文情感分析镜像全链路实践

从语料到模型应用&#xff5c;StructBERT中文情感分析镜像全链路实践 1. 引言&#xff1a;中文情感分析的现实挑战与技术选型 1.1 情感分析在实际业务中的价值 在当前以用户为中心的产品运营体系中&#xff0c;中文情感分析已成为企业洞察用户反馈、优化服务体验的核心能力。…

D.二分查找-进阶——658. 找到 K 个最接近的元素

题目链接&#xff1a;658. 找到 K 个最接近的元素&#xff08;中等&#xff09; 算法原理&#xff1a; 解法一&#xff1a;排序 19ms击败13.08% 时间复杂度O(NlogN) 这个解法其实挺暴力的&#xff0c;直接用把arr全扔链表里&#xff0c;然后按照题目要求把链表排序&#xff0c;…

Java SpringBoot+Vue3+MyBatis 抗疫物资管理系统系统源码|前后端分离+MySQL数据库

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 新冠疫情爆发以来&#xff0c;全球范围内对防疫物资的需求急剧增加&#xff0c;如何高效、精准地管理抗疫物资成为各级政府和医疗机构面临的重大挑…

【2025最新】基于SpringBoot+Vue的学生网上请假系统管理系统源码+MyBatis+MySQL

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着信息化技术的快速发展&#xff0c;传统纸质请假流程已无法满足现代高校管理的需求。学生请假流程繁琐、审批效率低下、数据统计困难等问题日益…

gpt-oss-20b-WEBUI实战:云端10分钟部署,2块钱玩一下午

gpt-oss-20b-WEBUI实战&#xff1a;云端10分钟部署&#xff0c;2块钱玩一下午 你是不是也遇到过这样的场景&#xff1f;团队里有人用AI写产品文案&#xff0c;几分钟就输出一整套卖点提炼、用户话术和推广标题&#xff0c;效率高得离谱。而你还卡在“这个功能怎么描述更吸引人…

BGE-M3一键启动:语义搜索实战指南(附避坑技巧)

BGE-M3一键启动&#xff1a;语义搜索实战指南&#xff08;附避坑技巧&#xff09; 1. 引言 1.1 业务场景与技术背景 在当前信息爆炸的时代&#xff0c;高效、精准的语义搜索已成为智能应用的核心能力之一。无论是知识库问答系统、推荐引擎还是文档检索平台&#xff0c;背后都…

DeepSeek-R1-Distill-Qwen-1.5B高效运维:日志监控与性能分析实战

DeepSeek-R1-Distill-Qwen-1.5B高效运维&#xff1a;日志监控与性能分析实战 1. 引言&#xff1a;轻量级大模型的运维挑战与机遇 随着边缘计算和本地化AI部署需求的增长&#xff0c;轻量级大模型正成为开发者和运维工程师关注的焦点。DeepSeek-R1-Distill-Qwen-1.5B 作为一款…

如何高效批量抠图?试试CV-UNet大模型镜像,本地部署秒级出图

如何高效批量抠图&#xff1f;试试CV-UNet大模型镜像&#xff0c;本地部署秒级出图 1. 背景与需求&#xff1a;AI抠图的效率革命 在电商、广告设计、内容创作等领域&#xff0c;图像背景移除是一项高频且耗时的任务。传统依赖Photoshop等专业工具的手动抠图方式&#xff0c;不…

Qwen3-VL-WEB保姆级教程:多语言文本识别实战应用

Qwen3-VL-WEB保姆级教程&#xff1a;多语言文本识别实战应用 1. 引言 1.1 业务场景描述 在当今全球化背景下&#xff0c;跨语言信息处理已成为企业数字化转型中的关键需求。无论是跨境电商的商品标签识别、国际文档的自动化归档&#xff0c;还是多语种用户界面的内容提取&am…

Qwen3-Embedding-0.6B最佳实践:云端部署省时省力

Qwen3-Embedding-0.6B最佳实践&#xff1a;云端部署省时省力 你是否也遇到过这样的科研困境&#xff1f;实验室GPU资源紧张&#xff0c;排队等上好几天才能跑一次任务&#xff1b;项目进度卡在数据预处理环节&#xff0c;团队协作效率低下。尤其是在做社会舆情分析这类需要批量…

GPT-OSS-20B-WEBUI操作手册:管理员后台管理功能

GPT-OSS-20B-WEBUI操作手册&#xff1a;管理员后台管理功能 1. 概述与部署准备 随着开源大模型生态的快速发展&#xff0c;GPT-OSS-20B作为OpenAI社区推动的重要项目之一&#xff0c;凭借其强大的语言理解与生成能力&#xff0c;正在被广泛应用于研究、教育及企业级推理服务场…

从零部署高精度中文ASR|科哥FunASR镜像全解析

从零部署高精度中文ASR&#xff5c;科哥FunASR镜像全解析 1. 引言&#xff1a;为什么选择科哥定制版FunASR&#xff1f; 在语音识别&#xff08;ASR&#xff09;技术快速发展的今天&#xff0c;构建一个高精度、低延迟、易用性强的本地化中文语音识别系统已成为智能硬件、数字…

Qwen2.5-7B模型优化:内存访问模式改进

Qwen2.5-7B模型优化&#xff1a;内存访问模式改进 1. 引言 1.1 技术背景与挑战 大型语言模型&#xff08;LLM&#xff09;在推理过程中对显存带宽和内存访问效率极为敏感&#xff0c;尤其是在处理长序列生成任务时。Qwen2.5-7B-Instruct作为通义千问系列中参数规模为76亿的指…

UI-TARS-desktop入门实战:Qwen3-4B-Instruct模型基础功能体验

UI-TARS-desktop入门实战&#xff1a;Qwen3-4B-Instruct模型基础功能体验 1. UI-TARS-desktop简介 Agent TARS 是一个开源的多模态 AI Agent 框架&#xff0c;致力于通过融合视觉理解&#xff08;Vision&#xff09;、图形用户界面操作&#xff08;GUI Agent&#xff09;等能…