Cython学习笔记1:利用Cython加速Python运行速度
Cython学习笔记1:利用Cython加速Python运行速度
- Cython
- Cython 的核心特点:
- 利用Cython加速Python运行速度
- 1. Cython加速Python运行速度原理
- 2. 不使用Cython
- 3. 使用Cython加速
- (1)使用pip安装 cython 和 setuptools 库
- (2)安装c语言编译器
- (3)创建要编译为动态链接库的.py文件
- (4)创建setup.py
- (5)把.py转化为库文件
- (6)python程序调用库
- (7)annotate参数
- (8)定义变量的类型加速python运行速度
Cython
Cython 是一个用于将 Python 代码转换为 C 语言扩展模块的编程语言。它允许你在 Python 中编写 C 风格的代码,从而提高性能,尤其是在需要大量计算的情况下。通过将 Python 代码与 C 代码混合使用,Cython 既保留了 Python 的简洁性,又能提升程序的执行速度。
Cython 的核心特点:
- 提高性能:Cython 可以将 Python 代码编译成 C 语言代码,然后生成高效的 C 扩展模块。它适用于需要频繁计算的任务,尤其是数值计算和循环处理。
- 与 C 代码交互:Cython 允许直接调用 C 函数和访问 C 数据结构,从而减少了 Python 和 C 之间的接口调用开销。
- 简化 C 接口:与直接使用 C 语言不同,Cython 通过 Python 风格的语法简化了 C 接口的使用,开发者可以快速将 Python 代码提升到 C 代码的性能。
- 无缝集成:Cython 代码可以与现有的 Python 代码无缝集成,开发者不需要重写整个程序,通常只需要优化性能瓶颈部分。
利用Cython加速Python运行速度
以计算圆周率 π 为例子,使用Nilakantha 级数来计算 π 值,计算公式如下:

1. Cython加速Python运行速度原理

把 python 代码转化为 c 语言代码,然后再编译成动态链接库,最后使用 python 程序调用这个库
2. 不使用Cython
创建 2 个 .py文件,fun.py 和 Nilakantha_main.py
fun.py 用于写计算的函数
Nilakantha_main.py 用于调用函数,查看结果和运行时间

fun.py代码如下
def calculate_pi(count: int) -> float:pi = 3.0sign = 1for i in range(2, count * 2, 2):term = sign * 4.0 / (i * (i + 1) * (i + 2))pi += termsign *= -1return pi
Nilakantha_main.py代码如下
import time
import fundef main():start_time = time.time()print(fun.calculate_pi(20_000_000))end_time = time.time()print('Time:', end_time - start_time)if __name__ == '__main__':main()
运行Nilakantha_main.py文件后,结果如下:
3.141592653589787
Time: 4.7696967124938965
这段代码设置了迭代次数为2千万次,最后耗时4.76秒
下面使用cython加速
3. 使用Cython加速
(1)使用pip安装 cython 和 setuptools 库
使用如下命令进行安装,使用清华镜像源,这样速度更快
pip install cython setuptools -i https://pypi.tuna.tsinghua.edu.cn/simple
安装好后再安装就会出现下面的结果

(2)安装c语言编译器
下面的c语言编译器安装一款就可以了,博主是Windows11系统,安装的是Visiual Studio 2022
- GCC (GNU Compiler Collection)
- Clang
- Microsoft Visual C++ (MSVC)
- MinGW (Minimalist GNU for Windows)
(3)创建要编译为动态链接库的.py文件
新建一个名为fun_compile.py的文件,用于将它最后编译为动态链接库,让 python 程序调用
fun_compile.py代码如下
# cython: language_level=3
def calculate_pi(count: int) -> float:pi = 3.0sign = 1for i in range(2, count * 2, 2):term = sign * 4.0 / (i * (i + 1) * (i + 2))pi += termsign *= -1return pi
# cython: language_level=3
这一行代码的作用是:指示 Cython 编译器使用 Python 3 语法的指令,告诉 Cython 如何解析和编译 Python 代码,确保代码遵循 Python 3 的语法规则,而不是 Python 2
(4)创建setup.py
setup.py 是 Python 项目中用于打包和分发代码的脚本,它包含了项目的元数据和配置,用于指导 Python 工具(setuptools)如何构建、安装和分发项目。
setup.py中的代码如下
from Cython.Build import cythonize
from setuptools import setupsetup(ext_modules=cythonize(["fun_compile.py"]),
)
fun_compile.py是编译为动态链接库的 python 代码
(5)把.py转化为库文件
当前目录下的文件如下展示

在此目录下,执行命令
python setup.py build_ext --inplace
过程展示如下

运行完成后,目录里会多出一个 .c 文件和一个库文件

(6)python程序调用库
修改Nilakantha_main.py,导入fun_compile,如果既存在fun_compile.py,也存在fun_compile.py产生的库,会优先调用动态链接库。代码如下:
import time
import fun
import fun_compiledef main():start_time = time.time()print(fun.calculate_pi(20_000_000))end_time = time.time()print('Time:', end_time - start_time)start_time = time.time()print(fun_compile.calculate_pi(20_000_000))end_time = time.time()print('Time:', end_time - start_time)if __name__ == '__main__':main()
运行结果如下:

可以看到确实加速了
(7)annotate参数
修改setup.py,加入一个参数annotate=True
from Cython.Build import cythonize
from setuptools import setupsetup(ext_modules=cythonize(["fun_compile.py"], annotate=True),
)
然后执行命令
python setup.py build_ext --inplace
结果会多出来一个.html文件

annotate=True 参数的作用是:生成 Cython 编译时的注释文件,用于查看 Cython 将 Python 代码转换为 C 代码的详细过程和每一步的性能分析。
通过浏览器打开这个.html文件

黄色线条的代码表示翻译后的代码依赖 python 代码,颜色越深,依赖越强
点击“+”开头的行,可查看 Cython 为其生成的 c语言 代码
点开红色框的这一行,可以看到这行代码都是用 python实现的

如果想让这段代码不都用 python 来实现,可以给其中的变量添加类型,这就是这段代码没有用c语言实现的原因,因为cython不知道变量的类型。
(8)定义变量的类型加速python运行速度
修改fun_compile.py文件,代码如下:
# cython: language_level=3
import cythondef calculate_pi(count: int) -> float:pi = 3.0sign = 1for i in range(2, count * 2, 2):term = sign * 4.0 / (i * (i + 1) * (i + 2))pi += termsign *= -1return pidef calculate_pi_annotated(count: int) -> float:pi: cython.double = 3.0sign: cython.int = 1i: cython.intfor i in range(2, count * 2, 2):term: cython.double = sign * 4.0 / (i * (i + 1) * (i + 2))pi += termsign *= -1return pi
重新编译
python setup.py build_ext --inplace
修改Nilakantha_main.py,代码如下:
import time
import fun
import fun_compiledef main():start_time = time.time()print(fun.calculate_pi(20_000_000))end_time = time.time()print('Time:', end_time - start_time)start_time = time.time()print(fun_compile.calculate_pi(20_000_000))end_time = time.time()print('Time:', end_time - start_time)start_time = time.time()print(fun_compile.calculate_pi_annotated(20_000_000))end_time = time.time()print('Time:', end_time - start_time)if __name__ == '__main__':main()
运行后结果如下

可以看到加入变量类型加入后的代码运行效果更快了。
相关文章:
Cython学习笔记1:利用Cython加速Python运行速度
Cython学习笔记1:利用Cython加速Python运行速度 CythonCython 的核心特点:利用Cython加速Python运行速度1. Cython加速Python运行速度原理2. 不使用Cython3. 使用Cython加速(1)使用pip安装 cython 和 setuptools 库(2&…...
【从0做项目】Java音缘心动(1)———项目介绍设计
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 零:项目结果展示 一:音乐播放器Web网页介绍 二:前期准备工作&…...
智慧农业新生态 | 农业数字化服务平台——让土地生金,让服务无忧
一部手机管农事,从播种到丰收,全链路数字化赋能! 面向农户、农机手、农服商、农资商打造的一站式农业产业互联网平台,打通农资交易、农机调度、农服管理、技术指导全场景闭环,助力乡村振兴提效增收。 三大核心场景&am…...
C++编程,#include <iostream>详解,以及using namespace std;作用
在C编程中,#include <iostream> 是用来包含输入/输出流头文件的预处理指令。它允许程序使用标准的输入/输出对象如 std::cout 和 std::cin,以便与标准输入和输出流进行交互。这一头文件是编写输入输出操作时必不可少的部分。 讲到这里,…...
jetbrains IDEA集成大语言模型
一、CodeGPT CodeGPT是由CSDN打造的一款生成式AI产品,专为开发者量身定制。它能够提供强大的技术支持,帮助开发者在学习新技术或解决实际工作中的各种计算机和开发难题1。 idea集成 1.在线安装:直接在线安装 2.离线安装 JetBrains Mar…...
理解都远正态分布中指数项的精度矩阵(协方差逆矩阵)
之前一直不是很理解这个公式为什么用这个精度矩阵,为什么这么巧合,为什么是它,百思不得其解,最近有了一些新的理解: 1. 这个精度矩阵相对公平合理的用统一的方式衡量了变量间的关系,但是如果是公平合理的衡…...
使用 Spark NLP 实现中文实体抽取与关系提取
在自然语言处理(NLP)领域,实体抽取和关系提取是两个重要的任务。实体抽取用于从文本中识别出具有特定意义的实体(如人名、地名、组织名等),而关系提取则用于识别实体之间的关系。本文将通过一个基于 Apache Spark 和 Spark NLP 的示例,展示如何实现中文文本的实体抽取和…...
less-8 boolen盲注,时间盲注 函数补全
获取当前数据库名 import requestsdef inject_database(url):namemax_length20 # 假设数据库名称最大长度为20# ASCII范围:数字、字母、下划线(_)low{a: 97, z: 122, A: 65, Z: 90, 0: 48, 9: 57, _: 95}high{97: a, 122: z, 65: A, 90: Z,…...
[NKU]C++基础课(五)补充:结构体
【3.3】C结构体介绍_哔哩哔哩_bilibili 结构体 最厉害的学生 现有N名同学参加了期末考试,并且获得了每名同学的信息: 1 姓名(不超过8个字符的仅有英文小写字母的字符串) 2 语文、数学、英语成绩(均为不超过150的自然数)。 3 总分最高的学生就是最厉害的。 请输…...
亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!
作者:程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案,但是很多人表示还是用的不够爽,比如用CodeChat的方案,只支持V3版本,不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么,今天,给…...
springcloud整合seata
1、前置安装与了解: 1、nacos的安装:docker安装nacos并挂载 2、seata的安装:docker安装seata并挂载,同时注册到nacos 3、spring-boot版本为2.6.12,spring-cloud-alibaba版本为2021.0.4.0,spring-cloud版本…...
Html5学习教程,从入门到精通,HTML5 简介语法知识点及案例代码(1)
HTML5 简介 HTML5 是最新的 HTML 标准,它引入了许多新特性,使网页开发更加强大和灵活。以下是一些关键的 HTML5 语法知识点: 1. 文档类型声明 (DOCTYPE) HTML5 的文档类型声明非常简单: <!DOCTYPE html>2. 字符编码 HT…...
Django加bootstrap实现上传文件含有进度条
1. 项目结构 myproject/ ├── myproject/ │ ├── settings.py │ ├── urls.py │ └── ... ├── myapp/ │ ├── templates/ │ │ └── upload.html │ ├── views.py │ ├── urls.py │ └── ... └── media/ # 手动创…...
八大排序算法(2)交换排序-冒泡排序 和 快速排序
快速排序(Quick Sort) 和 冒泡排序(Bubble Sort) 都是常见的交换排序算法,它们的核心思想都是通过交换元素来实现排序。但是,它们的工作原理和性能差异非常大。下面我们来详细对比这两种排序算法࿱…...
Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅
摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…...
STM32MP157A单片机移植Linux驱动
在stm32mp157a单片机移植Linux操作系统,并移植内核驱动,在应用程序中使用3个线程,分别实现控制单片机上3个led流水灯的功能、蜂鸣器控制的功能、风扇控制的功能。 需求整理: 1.驱动程序-->led1.c,led2.cÿ…...
Qt程序退出相关资源释放问题
目录 问题背景: aboutToQuit 代码举例 closeEvent事件 代码举例 程序退出方式 quit() exit(int returnCode 0) close() 问题背景: 实际项目中程序退出前往往需要及进行一些资源释放、配置保存、线程中断等操作,避免资源浪费ÿ…...
【大学生职业规划大赛备赛PPT资料PDF | 免费共享】
自取链接: 链接:https://pan.quark.cn/s/4fa45515325e 📢 同学,你是不是正在为职业规划大赛发愁? 想展示独特思路却不知如何下手? 想用专业模板却找不到资源? 别担心!我整理了全网…...
win32汇编环境,对话框中使用菜单示例一
;运行效果 ;win32汇编环境,对话框中使用菜单示例一 ;最基本的应用,即添加菜单及点击后响应的操作方法 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>&g…...
AutoDock CrankPep or ADCP进行蛋白质多肽对接
需求描述 使用AutoDock CrankPep or ADCP进行蛋白质多肽对接 硬件及系统配置 自用电脑型号如下: 电脑:Precision Tower 7810 (Dell Inc.) CPU : Intel Xeon CPU E5-2686 v4 2.30GHz GPU: NVIDIA GeForce GTX 1070 Linux版本&a…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
