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 的核心特点:

  1. 提高性能:Cython 可以将 Python 代码编译成 C 语言代码,然后生成高效的 C 扩展模块。它适用于需要频繁计算的任务,尤其是数值计算和循环处理。
  2. 与 C 代码交互:Cython 允许直接调用 C 函数和访问 C 数据结构,从而减少了 Python 和 C 之间的接口调用开销。
  3. 简化 C 接口:与直接使用 C 语言不同,Cython 通过 Python 风格的语法简化了 C 接口的使用,开发者可以快速将 Python 代码提升到 C 代码的性能。
  4. 无缝集成:Cython 代码可以与现有的 Python 代码无缝集成,开发者不需要重写整个程序,通常只需要优化性能瓶颈部分。

利用Cython加速Python运行速度

以计算圆周率 π 为例子,使用Nilakantha 级数来计算 π 值,计算公式如下:
在这里插入图片描述

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

在这里插入图片描述
把 python 代码转化为 c 语言代码,然后再编译成动态链接库,最后使用 python 程序调用这个库

2. 不使用Cython

创建 2 个 .py文件,fun.pyNilakantha_main.py

fun.py 用于写计算的函数
Nilakantha_main.py 用于调用函数,查看结果和运行时间
在这里插入图片描述
fun.py代码如下

def calculate_pi(count: int) -> float:
    pi = 3.0
    sign = 1
    for i in range(2, count * 2, 2):
        term = sign * 4.0 / (i * (i + 1) * (i + 2))
        pi += term
        sign *= -1
    return pi

Nilakantha_main.py代码如下

import time
import fun


def 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

  1. GCC (GNU Compiler Collection)
  2. Clang
  3. Microsoft Visual C++ (MSVC)
  4. 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.0
    sign = 1
    for i in range(2, count * 2, 2):
        term = sign * 4.0 / (i * (i + 1) * (i + 2))
        pi += term
        sign *= -1
    return 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 setup

setup(
    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_compile


def 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 setup

setup(
    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 cython


def calculate_pi(count: int) -> float:
    pi = 3.0
    sign = 1
    for i in range(2, count * 2, 2):
        term = sign * 4.0 / (i * (i + 1) * (i + 2))
        pi += term
        sign *= -1
    return pi


def calculate_pi_annotated(count: int) -> float:
    pi: cython.double = 3.0
    sign: cython.int = 1
    i: cython.int
    for i in range(2, count * 2, 2):
        term: cython.double = sign * 4.0 / (i * (i + 1) * (i + 2))
        pi += term
        sign *= -1
    return pi

重新编译

python setup.py build_ext --inplace

修改Nilakantha_main.py,代码如下:

import time
import fun
import fun_compile


def 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()

运行后结果如下
在这里插入图片描述
可以看到加入变量类型加入后的代码运行效果更快了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Deepseek】Linux 本地部署 Deepseek

前言 本文介绍在 Linux 系统上部署 Deepseek AI。本文教程是面向所有想体验 AI 玩家的一个简易教程,因此即使是小白也可以轻松完成体验,话不多说立马着手去干。 [注]:笔者使用的系统为 Ubuntu 24.10 1. 关于 ollama Ollama 是一款开源应用…

【python】网页批量转PDF

安装wkhtmltopdf 网站:wkhtmltopdf wkhtmltopdf http://www.baidu.com/ D:website1.pdf 安装pdfkit库 pip install pdfkit 批量转换代码 import os import pdfkit path_wkthmltopdf rE:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe config pdfkit.configu…

JSON格式,C语言自己实现,以及直接调用库函数(一)

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。以下为你提供不同场景下常见的 JSON 格式示例。 1. 简单对象 JSON 对象是由键值对组成,用花括号 {} 包裹&…

Web自动化之Selenium 超详细教程(python)

Selenium是一个开源的基于WebDriver实现的自动化测试工具。WebDriver提供了一套完整的API来控制浏览器,模拟用户的各种操作,如点击、输入文本、获取页面元素等。通过Selenium,我们可以编写自动化脚本,实现网页的自动化测试、数据采…

【Cadence射频仿真学习笔记】Pcell Designer设计电感学习笔记

Cadence的Pcell designer官方入门教程 一、下载Pcell Designer 首先,前往Cadence网站下载Pcell Designer软件 (具体安装过程就不记录了,大家自己去看视频吧) 二、创建新的P-cell 然后打开Virtuoso,点击Tools->…

体验用ai做了个python小游戏

体验用ai做了个python小游戏 写在前面使用的工具2.增加功能1.要求增加视频作为背景。2.我让增加了一个欢迎页面。3.我发现中文显示有问题。4.我提出了背景修改意见,欢迎页面和结束页面背景是视频,游戏页面背景是静态图片。5.提出增加更多游戏元素。 总结…

前端导出word文件,并包含导出Echarts图表等

基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …

易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR

原文&#xff1a;ChIP-seqDRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性&#xff5c;NAR 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在饥饿等能量胁迫条件下&#xff0c;生物体会通过调整…

车载调频发射机-参观、考察、学习随车讲解的好助手-车载移动调频发射车队解说导览系统应用

车载调频发射机-参观、考察、学习随车讲解的好助手-车载移动调频发射车队解说导览系统应用 北京海特伟业科技有限公司任洪卓于2025年2月20日发布 在现代社会&#xff0c;政务接待、企业接待、外出考察和车队旅游等活动越来越频繁。无论是政府官员、企业高管&#xff0c;还是旅…

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…

ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)

一、什么是ESP32的AP无线热点模式&#xff1f; ESP32 的 AP&#xff08;Access Point&#xff09;模式 是指 ESP32 作为无线接入点运行&#xff0c;它自己创建一个 Wi-Fi 网络&#xff0c;允许其他设备&#xff08;如手机、电脑、平板等&#xff09;直接连接到它上面&#xff0…

Ubuntu 22.04 一键部署MinerU1.1.0

MinerU MinerU是一款将PDF转化为机器可读格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取为任意格式。 MinerU诞生于书生-浦语的预训练过程中&#xff0c;我们将会集中精力解决科技文献中的符号转化问题&#xff0c;希望在大模型时代为科技发…

AI工作流+专业知识库+系统API的全流程任务自动化

我有点悲观&#xff0c;甚至很沮丧&#xff0c;因为AI留给普通人的机会不多了&#xff0c;这既是人类之间权力的斗争&#xff0c;也是硅基生命和碳基生命的斗争。AI自动化是无法避免的趋势&#xff0c;如果人类不能平权&#xff0c;那就只能跪下接受审判。 通过整合AI工作流、专…

2026考研趋势深度解析:政策变化+高效工具指南

2026考研深度解析&#xff1a;趋势洞察高效工具指南&#xff0c;助你科学备战上岸 从政策变化到工具实战&#xff0c;这份千字攻略解决99%考生的核心焦虑 【热点引入&#xff1a;考研赛道进入“高难度模式”】 2025年全国硕士研究生报名人数突破520万&#xff0c;报录比预计扩…

javacv将mp4视频切分为m3u8视频并播放

学习链接 ffmpeg-demo 当前对应的 gitee代码 Spring boot视频播放(解决MP4大文件无法播放)&#xff0c;整合ffmpeg,用m3u8切片播放。 springboot 通过javaCV 实现mp4转m3u8 上传oss 如何保护会员或付费视频&#xff1f;优酷是怎么做的&#xff1f; - HLS 流媒体加密 ffmpe…

二叉树(数据结构)

二叉树 二叉树也是用过递归定义的结构 先序遍历又称前序遍历 ​​ ​​ 按照先序遍历的方法去手算处理这个二叉树 ​​ 先A B C 再 A B D E C&#xff08;也就是把B换成BDE再放进去&#xff09; 再 A B D E C F 看这个插入的方法要掌握像二叉树这样向一个…

如何利用国内镜像从huggingface上下载项目

1、利用镜像快速下载项目 在huggingface上下载模型时速度太慢&#xff0c;可以用下面的方法 pip install -U huggingface_hub pip install huggingface-cliexport HF_ENDPOINThttps://hf-mirror.comhuggingface-cli download --resume-download shenzhi-wang/Llama3-8B-Chine…

Http升级为Https - 开发/测试服环境

1.应用场景 主要用于开发/测试服环境将http升级为https, 防止前端web(浏览器)出现Mixed Content报错; 2.学习/操作 1.文档阅读 deepseek 问答; 2.整理输出 报错信息: Mixed Content: The page at <URL> was loaded over HTTPS, but requested an insecure XMLHttpRequ…

网页制作01-html,css,javascript初认识のhtml的基本标记

一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1&#xff09;头部标…

分布式 IO 模块:水力发电设备高效控制的关键

在能源领域不断追求高效与可持续发展的今天&#xff0c;水力发电作为一种清洁、可再生的能源形式&#xff0c;备受关注。而要实现水力发电设备的高效运行&#xff0c;精准的控制技术至关重要。分布式 IO 模块&#xff0c;正悄然成为水力发电设备高效控制的核心力量。 传统挑战 …