当前位置: 首页 > news >正文

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

目录

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

相关文章:

  • zlib库的交叉编译记录
  • 【Redis】java客户端(SpringData和jedis)
  • Kotlin 实战小记:No-Arg 引用解决 No constructor found的问题
  • Ubuntu24使用kubeadm部署高可用K8S集群
  • js处理数据(过滤)
  • 御道源码(ruoyi-vue-pro)个人使用小结
  • 运维:k8s常用命令大全
  • Docker部署nacos集群
  • css预处理是什么?作用是什么?
  • C# 利用XejeN框架源码,编写一个在 Winform 界面上的语法高亮的编辑器,使用 Monaco 编辑器
  • el-input-number 限制输入正整数
  • 部署YUM仓库及NFS共享服务
  • Unity贪吃蛇改编【详细版】
  • Selenium 获取请求响应
  • 【Springcloud微服务】Docker上篇
  • [PHP内核探索]PHP中的哈希表
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • crontab执行失败的多种原因
  • Date型的使用
  • ES6简单总结(搭配简单的讲解和小案例)
  • Go 语言编译器的 //go: 详解
  • Octave 入门
  • php面试题 汇集2
  • React Native移动开发实战-3-实现页面间的数据传递
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Unix命令
  • vue.js框架原理浅析
  • vue-router的history模式发布配置
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 坑!为什么View.startAnimation不起作用?
  • 老板让我十分钟上手nx-admin
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 因为阿里,他们成了“杭漂”
  • 原生 js 实现移动端 Touch 滑动反弹
  • 云大使推广中的常见热门问题
  • 从如何停掉 Promise 链说起
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​学习一下,什么是预包装食品?​
  • #微信小程序:微信小程序常见的配置传值
  • (23)Linux的软硬连接
  • (4)logging(日志模块)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (libusb) usb口自动刷新
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十六)Flask之蓝图
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .aanva
  • .dwp和.webpart的区别