Python高效内存访问,memoryview这个神器你值得拥有!

news2024/11/23 21:09:39

目录

1、初识memoryview 🌀

1.1 memoryview基础介绍

1.2 为何使用memoryview优化内存访问

1.3 创建memoryview对象实战

示例1:基于bytes创建memoryview

示例2:修改memoryview中的数据

示例3:memoryview与切片

2、深入理解memoryview操作 🔄

2.1 访问与修改数据

2.2 切片与迭代技巧

示例:切片操作

示例:迭代memoryview

2.3 memoryview与字节串互换

示例:memoryview转为bytes

示例:从bytes创建memoryview

3、memoryview性能优化秘诀 💨

3.1 减少数据复制提升效率

示例:避免复制操作

3.2 高效处理大文件读写

示例:大文件读取

3.3 结合numpy数组操作

示例:NumPy与memoryview互动

4、memoryview进阶应用 🔍

4.1 与ctypes协同操作C缓冲区

示例:与C共享数据

4.2 在多线程或多进程中共享数据

示例:多线程共享memoryview

4.3 实战:加速I/O密集型任务

示例:快速读取大文件并统计字符频率

5、安全与限制事项 🛡️

5.1 memoryview对象的生命周期管理

注意事项

5.2 避免常见的陷阱与误区

陷阱示例

5.3 与其他语言交互时的考量

实践建议

6、总结与展望 🌟



1、初识mem)oryview 🌀

1.1 memoryview基础介绍

memoryview是Python中用于访问数组缓冲区的一个高级接口,它提供了直接、高效的内存访问方式 ,而无需复制底层数据。这使得memoryview成为处理大型数据集或在对性能敏感的应用中进行内存操作的理想选择。它支持的数据类型包括但不限于bytes、bytearray以及NumPy数组等,能够直接映射到这些对象的内存上进行读写操作。

1.2 为何使用memoryview优化内存访问

memoryview的主要优势在于减少内存拷贝,这对于提高程序效率至关重要 ,尤其是在频繁操作大数据块时。通过避免不必要的数据复制,memoryview可以:

  • • 提升性能:直接操作底层内存减少了CPU和内存之间的数据传输,显著加快了数据处理速度。

  • • 节省资源:特别是在处理大型数据时,减少内存占用 ,避免了因数据复制导致的资源浪费。

  • • 兼容性:它允许Python代码无缝地与C扩展或需要直接内存访问的库协同工作。

1.3 创建memoryview对象实战

示例1:基于bytes创建memoryview
# 创建一个bytes对象
data = b'Hello, Memoryview World!'
# 从bytes创建memoryview对象
mv = memoryview(data)
print(mv[0])  # 输出第一个字节的整数值

输出:72

示例2:修改memoryview中的数据
# 使用bytearray ,因为memoryview直接来源于bytes的对象是只读的
mutable_data = bytearray('Modify Me', 'utf-8')
mv_modifiable = memoryview(mutable_data)

mv_modifiable[6] = ord('Y')  # 将第7个字符改为'Y'
print(mutable_data.decode('utf-8'))  # 输出修改后的字符串

输出:Modify Ye

示例3:memoryview与切片
data_slice = mv[7:12]  # 获取memoryview的部分视图
print(data_slice.tobytes().decode('utf-8'))  # 转换并打印为字符串

输出:Memoryview

通过上述示例 ,我们不仅见识了如何创建memoryview对象,还学习了如何通过它高效地访问和修改底层数据,以及如何利用切片功能来操作特定数据段。memoryview的引入 ,使得Python开发者在面对性能敏感场景时有了更强大的武器。

2、深入理解memoryview操作 🔄

2.1 访问与修改数据

memoryview不仅支持访问其封装的数据,还能在数据源允许的情况下进行修改。对于来自可变序列(如bytearray)的memoryview ,可以直接修改元素值。

示例:访问与修改

# 创建一个bytearray对象
ba = bytearray('Modify this text.', 'utf-8')
mv = memoryview(ba)

# 访问数据
print(mv[0])  # 打印第一个字节的值

# 修改数据
mv[6] = 111  # 将第7个字符'o'替换为'O'的ASCII值
print(ba.decode('utf-8'))  # 显示修改后的字符串

输出:

77
Modify Othis text.

示例代码:

# 错误示范:尝试修改来自bytes的MemoryView
data = b"read only"
view = memoryview(data)
try:
    view[0] = 100  # 尝试修改
except TypeError as e:
    print(f"错误:{e}")

输出:

错误:'memoryview': a readonly buffer

2.2 切片与迭代技巧

memoryview支持Python的切片语法,能够方便地获取数据的子集。同时 ,它也是可迭代的,便于遍历处理大量数据。

示例:切片操作
mv_slice = mv[7:15]  # 获取从索引7到14的子视图
print(mv_slice.tobytes().decode('utf-8'))  # 转换并打印子视图内容

输出:Othis tex

示例:迭代memoryview
for byte in mv:
    print(chr(byte), end='')  # 将每个字节转换为字符并打印
print()  # 打印换行

输出:Modify Othis text.

2.3 memoryview与字节串互换

memoryview和bytes、bytearray之间可以相互转换,为数据处理提供了灵活性。

示例:memoryview转为bytes
bytes_obj = mv.tobytes()
print(bytes_obj)  # 打印转换后的bytes对象

输出:b'Modify Othis text.'

示例:从bytes创建memoryview
data = bytes('New data he

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

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

相关文章

【Java】已解决java.nio.channels.FileLockInterruptionException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例 已解决java.nio.channels.FileLockInterruptionException异常 在Java NIO(New I/O)中,java.nio.channels.FileLockInterruptionException是一个特殊的异常&am…

tedsign vue3 web-端框架中封装一个验证码组件 以及对应node 接口逻辑说明

一个这样的组件 我直接上代码了 <template><t-loading size"small" :loading"loading" show-overlay><div class"container" click"refresh"><div v-if"svg" class"svg" v-html"svg&…

VUE3脚手架工具cli配置搭建及创建VUE工程

1、VUE的脚手架工具(CLI&#xff09; 开发大型vue的时候&#xff0c;不能通过html编写一个大型的项目&#xff0c;这个时候需要用到vue的脚手架工具 通过vue的脚手架&#xff0c;可以快速的生成vue工程 1.1、安装nodejs和npm 【下载nodejs】 https://nodejs.org/en 【安装…

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画&#xff0c;LITO方式是一样的 首先加入自己的开机动画&#xff0c;制作过程看前面的部分 打开qssi.mk文件&#xff0c;在文件的最后加入内容 PRODUCT_CO…

python爬虫学习笔记一(基本概念urllib基础)

学习资料&#xff1a;尚硅谷_爬虫 学习环境: pycharm 一.爬虫基本概念 爬虫定义 > 解释1&#xff1a;通过程序&#xff0c;根据URL进行爬取网页&#xff0c;获取有用信息 > 解释2&#xff1a;使用程序模拟浏览器&#xff0c;向服务器发送请求&#xff0c;获取相应信息…

某程序员:30岁了,老婆管钱,背着我买了50万股票,亏了20w,强制她清仓后又买了36万

“辛辛苦苦攒了几年钱&#xff0c;本想买房买车&#xff0c;结果全被老婆炒股亏掉了&#xff01;” 近日&#xff0c;一位30岁的程序员大哥在网上吐苦水&#xff0c;引发了网友们的热议。 这位程序员大哥和妻子结婚后&#xff0c;一直秉持着“男主外&#xff0c;女主内”的传统…

C++——位图的介绍和使用

位图的介绍 位图的引入 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中&#xff1f; 要判断一个数是否在某一堆数中&#xff0c;我们可能会想到如下方法&#xff1a; 将这一堆数进行排序&#xff0c…

VBA学习(16):工作表事件示例:输入数据后锁定单元格

在工作表单元格中输入数据后&#xff0c;该单元格就被锁定&#xff0c;不能再编辑。 打开VBE&#xff0c;在工程资源管理器中双击该工作表名称打开其代码模块&#xff0c;在其中输入下面的代码&#xff1a; 假设整个工作表的LockedFalse Private Sub Worksheet_Change(ByVal …

【文献及模型、制图分享】1985-2015年美国坦帕湾流域土地开发利用强度时空变化分析

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

顶顶通呼叫中心中间件-机器人测试流程(mod_cti基于FreeSWITCH)

感兴趣的话可以点后面链接添加联系方式顶顶通小孙 一、打开ccadmin-web并且创建分机 1、登录ccadmin-web 登录地址&#xff1a;http://ddcti.com:88 登录之后根据下图去登录ccadmin-web系统。 2、创建分机 点击呼叫中心 -> 点击分机设置 -> 点击新增&#xff0c;点击…

超级管道,品质非凡——钢塑复合管

钢塑复合管&#xff0c;是一种新型的复合管材&#xff0c;又叫涂塑钢管&#xff0c;涂塑钢管有内涂塑钢管&#xff0c;外涂塑钢管&#xff0c;内外涂塑钢管&#xff0c;外镀锌内涂塑钢管&#xff0c;外3pe防腐内涂塑钢管等。 它结合了钢管和塑料管的优点&#xff0c;具有高强度…

LATR 算法解读

文章目录 1. 论文2. 环境安装3. 代码解读3. 1 初始化 lane query3.1.1 SparseInsDecoder3.1.2 loss 计算3.1.3 初始化instance query3.2 ref points 的生成3.3 lane query 和feats进行attention3.3.1 self attn3.3.1 cross attn4. 参考1. 论文 2. 环境安装 146 [2024-06-20 10…

用自己的数据集训练TimeSformer并转ONNX用c++推理

用自己的数据集训练TimeSformer并转ONNX用c++推理 文章目录 用自己的数据集训练TimeSformer并转ONNX用c++推理下载安装TimeSformer创建分类文件夹创建数据集修改训练配置运行脚本开始训练测试模型模型转为onnx测试一下生成的onnx模型转为用c++推理下载安装TimeSformer TimeSfo…

IDEA中Maven--下载安装自己适配的版本---理解

Maven解释&#xff1a; Maven是一个强大的项目管理工具和构建工具&#xff0c;主要用于Java项目。它能够帮助开发团队管理项目的依赖、构建项目、发布文档和报告&#xff0c;并能够自动化许多重复的任务。 Maven的主要作用包括&#xff1a; 依赖管理&#xff1a;Maven能够管理…

Google Earth Engine(GEE)——checkbox的使用

结果 函数: ui.Checkbox(label, value, onChange, disabled, style) A checkbox with a label. Arguments: label (String, optional): The checkboxs label. Defaults to an empty string. value (Boolean, optional): Whether the checkbox is checked. A nu

SpringBoot 实现RequestBodyAdvice封装统一接受类功能

一、相关往期文章 SpringBootVue实现AOP系统日志功能_aop的vue完整项目 Spring AOP (面向切面编程&#xff09;原理与代理模式—实例演示_面向切面aop原理详解 二、需求分析 按照一般情况&#xff0c;统一接受类可以像以下的方式进行处理&#xff1a; 如果不想使用 Request…

8路编码器脉冲计数器或16路DI高速计数器,Modbus RTU模块 YL69-485/232

特点&#xff1a; ● 编码器解码转换成标准Modbus RTU协议 ● 可用作编码器计数器或者转速测量 ● 支持8个编码器同时计数&#xff0c;可识别正反转 ● 也可以设置作为16路独立DI高速计数器 ● 编码器计数值支持断电自动保存 ● DI输入和电源之间3000V隔离 ● 通过RS-4…

在线二维码解码器:将二维码转换成网址链接

在当今数字化时代&#xff0c;二维码&#xff08;QR码&#xff09;已成为一种便捷的信息传递工具。它不仅可以存储大量数据&#xff0c;还能快速分享信息。然而&#xff0c;有时我们需要将二维码中的内容转换为网址链接&#xff0c;以便在浏览器中直接访问。小编将详细介绍如何…

【Java】已解决java.nio.channels.ClosedChannelException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.ClosedChannelException异常 在Java的NIO&#xff08;New I/O&#xff09;编程中&#xff0c;java.nio.channels.ClosedChannelException是一个常见的异常…

内容安全复习 5 - 深在线社交网络分析与舆情监测

文章目录 在线社交网络分析什么是在线社交网络什么是在线社交网络分析社交网络信息传播基本模型影响力模型传染模型影响力计算公式 网络舆情监测网络舆情概述网络舆情监测系统 在线社交网络分析 什么是在线社交网络 在线社交网络是一种在信息网络上由社会个体集合及个体之间的…