码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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
    1. # 创建一个bytes对象
    2. data = b'Hello, Memoryview World!'
    3. # 从bytes创建memoryview对象
    4. mv = memoryview(data)
    5. print(mv[0])  # 输出第一个字节的整数值

    输出:72

    示例2:修改memoryview中的数据
    1. # 使用bytearray ,因为memoryview直接来源于bytes的对象是只读的
    2. mutable_data = bytearray('Modify Me', 'utf-8')
    3. mv_modifiable = memoryview(mutable_data)
    4. mv_modifiable[6] = ord('Y')  # 将第7个字符改为'Y'
    5. print(mutable_data.decode('utf-8'))  # 输出修改后的字符串

    输出:Modify Ye

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

    输出:Memoryview

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

    2、深入理解memoryview操作 🔄

    2.1 访问与修改数据

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

    示例:访问与修改

    1. # 创建一个bytearray对象
    2. ba = bytearray('Modify this text.', 'utf-8')
    3. mv = memoryview(ba)
    4. # 访问数据
    5. print(mv[0])  # 打印第一个字节的值
    6. # 修改数据
    7. mv[6] = 111  # 将第7个字符'o'替换为'O'的ASCII值
    8. print(ba.decode('utf-8'))  # 显示修改后的字符串

    输出:

    1. 77
    2. Modify Othis text.

    示例代码:

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

    输出:

    错误:'memoryview': a readonly buffer

    2.2 切片与迭代技巧

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

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

    输出:Othis tex

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

    输出:Modify Othis text.

    2.3 memoryview与字节串互换

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

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

    输出:b'Modify Othis text.'

    示例:从bytes创建memoryview
    data = bytes('New data he
  • 相关阅读:
    智慧电力运维系统助力实现配电室无人值守
    学习常用算法——python
    用于发票处理的 DocuWare,摆脱纸张和数据输入的束缚,自动处理所有收到的发票
    【2012NOIP普及组】T2. 寻宝 试题解析
    如何一步步优化负载均衡策略
    OpenAI发布Sora模型,可根据文字生成逼真AI视频
    在线OJ项目(1)------实现代码编译运行功能
    【RPA技术】前 5 个开源 RPA 框架——以及如何选择
    C++中的CopyElision
    语言模型和编解码模型
  • 原文地址:https://blog.csdn.net/xyh2004/article/details/139880717
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号