python内置类memoryview()详解

news2024/9/21 20:25:09

memoryview() Python 的一个内置class,可直接使用。它返回给定参数的“内存视图”对象。内存视图对象是一个对支持缓冲区协议(如 bytes 或 bytearray)的数据的“窗口”或“视图”,它允许你在不复制数据的情况下操作内存中的数据。

1.缓冲区协议

buffer protocol是一种允许对象以二进制数据形式共享内存的机制。这个协议对于实现低层次的、高效的数据访问和操作非常有用,特别是在涉及大量数据处理时。支持缓冲区协议的对象可以直接进行内存操作,而不需要通过中间复制,这样可以大幅提高性能。

下面列出了一些主要的Python对象,支持缓冲区协议:

  1. bytes
    bytes对象允许访问其中的原始数据,但是不支持修改
  2. bytearray
    字节数组与bytes类似,但是bytearray是可变的,可修改。
  3. 其他的如array模块的array.array对象,第三方模块numpy的numpy.ndarray,还有某些实现了相应的__buffer__接口的对象等。

2 使用方法

memoryview基本语法如下:

memoryview(obj)

其中,obj 是一个支持缓冲协议的对象。

memoryview() 函数返回的是一个内存视图对象,而不是原始对象的副本。这意味着,对内存视图所做的任何修改都会反映到原始对象上。比如修改了内存视图中的某个字节,原始内容也会被改变。

属性

  • format: 返回一个表示数据的格式的字符串(例如 'B' 代表无符号字节)。注意这个属性并不总是可用的,取决于原始对象是否提供了这样的信息。
  • itemsize: 返回单个元素的字节大小。
  • ndim: 返回数据的维度数(总是 1,因为 memoryview 总是表示一维数组)。
  • shape: 返回一个元组,表示数据的形状(对于 memoryview 总是 (len(obj),))。
  • strides: 返回一个元组,表示跨步(strides),即为了从当前元素移动到下一个元素需要在内存中前进的字节数。对于连续的内存块,这个值通常是 itemsize。
  • tobytes(): 返回一个包含数据的字节对象(bytes)。
  • tolist(): 返回一个包含数据的列表。

方法

  • cast(format, shape=None): 创建一个新的 memoryview,具有不同的格式和/或形状。注意这不会更改原始数据,只是更改了如何解释它。
  • __getitem__(index): 使用索引访问单个元素或切片。
  • __setitem__(index, value): 使用索引设置单个元素的值(如果原始对象是可变的)。
  • __len__(): 返回数据的长度(元素数量)。

切片

memoryview 对象支持切片操作,允许你访问原始数据的一部分。切片返回一个新的 memoryview 对象,它引用原始数据的一个子集。

3 示例介绍

字节bytes转为内存对象

#定义bytes内存试图
byte_s = b"Hello,World!"
mview = memoryview(byte_s)
print(mview)
<memory at 0x10b217400>
  • 切片操作

切片后将内存视图对象通过tobyte()s转为字节或者tolist()转为列表查看

print(mview[0:4].tobytes())
b'Hell'
print(mview[0:4].tolist())
[72, 101, 108, 108]
  • 查看单个元素值

通过__getitem__()查看单个元素的值,查出来的是字符在编码中对应的数字,通过chr()转为字符

print(f'访问单个元素值 {mview.__getitem__(2)} 转为字符:{chr(mview.__getitem__(2))}')
访问单个元素值 108 转为字符:l
  • 查看元素个数
print(f'元素个数 {len(mview)}')
元素个数 12
  • 字节的内存对象不支持修改

比如修改元素值会报错:

mview[0]=100
TypeError: cannot modify read-only memory

字节数组bytearray转为内存对象

bytearray()函数传入字节数据,转为数组,类似于列表,数组本身支持切片/修改等操作。

byte_s = b"Hello,World!"
s_array = bytearray(byte_s)
mview = memoryview(s_array)

字节数组内存对象的操作与上述字节内存对象大多一致,但是字节数组支持修改:

比如将第一位代表的ASCII数字改为100
mview[0]=100
print(mview.tobytes())
b'dello,World!'

结果显示原来字符h被改为了字符d

检查原始数据是否被修改

print(s_array)
bytearray(b'dello,World!')

结果显示原始数据也同样被修改了。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习和关注,谢谢大家。

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

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

相关文章

【机器学习】 技术栈和开发环境搭建

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 博客目录 技术栈编程语言库框架编辑器项目IDE …

数据分析需要注意哪些法律法规

数据分析 前言一、数据处理过程二、数据收集阶段的法律规则数据收集应具备合法、正当、透明原则数据收集应坚持最小必要原则数据收集应遵守知情-同意规则数据收集应遵守目的明确性要求 三、数据储存的法律规则四、数据使用与处理的阶段的法律规则数据安全保护义务按照数据分级分…

Linux:文件IO

Linux&#xff1a;文件IO C语言 文件IOfopen Linux 文件IOopen接口close接口write接口read接口 内存文件管理struct filestruct files_struct文件描述符 fd 缓冲区 C语言 文件IO 在正式讲解Linux中是如何对文件进行IO前&#xff0c;我们先简单回顾以下C语言中&#xff0c;是如…

【牛客】SQL206 获取每个部门中当前员工薪水最高的相关信息

1、描述 有一个员工表dept_emp简况如下&#xff1a; 有一个薪水表salaries简况如下&#xff1a; 获取每个部门中当前员工薪水最高的相关信息&#xff0c;给出dept_no, emp_no以及其对应的salary&#xff0c;按照部门编号dept_no升序排列&#xff0c;以上例子输出如下: 2、题目…

项目1:STM32+DHT11+FreeRTOS+emwin+LCD

第一部分&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;************ 【屏幕显示DHT11数据】 面向对象的思想编写硬件驱动程序&#xff0c;DHT11采集环境中的温湿度数据。使用FreeRTOS提供的任务间通信、同步、互斥&#xff0c;将DHT…

【Linux】AlmaLinux 9.4版本发布

AlmaLinux 9.4 正式版发布&#xff0c;该版本基于 Redhat Enterprise 9.4&#xff0c;内核版本号&#xff1a; 5.14.0-427.13.1.el9_4.x86_64 相对于Rocky Linux&#xff0c; AlmaLinux更加的稳定&#xff0c;生产环境建议使用AlmaLinux来替代CentOS 7.x AlmaLinux 9.4版本系统…

MIPI DPHY HS传输模式SoT和EoT的传输值

目录 1. 高速传输模式的传输序列 2. SoT传输序列 3. EoT传输序列 1. 高速传输模式的传输序列 Mipi DPHY的高速数据传输&#xff08;HST&#xff1a;High Speed Transmission&#xff09;以突发&#xff08;Burst&#xff09;方式发生。 为了帮助接收机同步&#xff1a; (1) …

Python-VBA函数之旅-str函数

目录 一、str函数的常见应用场景 二、str函数使用注意事项 三、如何用好str函数&#xff1f; 1、str函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、str函数的常…

Redis-配置文件详解

Redis配置文件详解 units单位 配置大小单位&#xff0c;开头定义基本度量单位&#xff0c;只支持bytes&#xff0c;大小写不敏感。 INCLUDES Redis只有一个配置文件&#xff0c;如果多个人进行开发维护&#xff0c;那么就需要多个这样的配置文件&#xff0c;这时候多个配置 文…

指针(5)加油吧

指针&#xff08;5&#xff09; 拿冒泡排序来举例&#xff1a; 1 .qsort void qsort (void* base,//base指向待排序数组的首元素的指针size_t num,//base指向数组中元素的个数size_t size,//base指向的数组中的一个元素的大小&#xff0c;单位是字节int(*cmp)(const void*,co…

前端工程化,前端监控,工作流,部署,性能

开发规范 创建项目的时候&#xff0c;配置下 ESlint&#xff0c;stylelint&#xff0c; prettier&#xff0c; commitlint 等; ESLint 主要功能&#xff1a; ESLint 是一个静态代码检查工具&#xff0c;用于在 JavaScript 代码中识别和报告模式。它的目标是提供一个插件化的 …

LeetCode 138. 随机链表的复制

目录 1.原题链接&#xff1a; 2.结点拆分&#xff1a; 代码实现&#xff1a; 3.提交结果&#xff1a; 4.读书分享&#xff1a; 1.原题链接&#xff1a; 138. 随机链表的复制 2.结点拆分&#xff1a; ①.拷贝各个结点&#xff0c;连接在原结点后面&#xff1b; ②.处…

Imitation Learning学习记录(理论例程)

前言 最近还是衔接着之前的学习记录&#xff0c;这次打算开始学习模仿学习的相关原理&#xff0c;参考的开源资料为 TeaPearce/Counter-Strike_Behavioural_Cloning: IEEE CoG & NeurIPS workshop paper ‘Counter-Strike Deathmatch with Large-Scale Behavioural Clonin…

【源头开发】运营级竞拍商城源码/抢拍转拍/竞拍源码/转卖寄售/拆分/溢价商城转拍溢价php源码uniapp源码

大家好啊&#xff0c;欢迎来到web测评&#xff0c;我是年哥&#xff0c;我们有个小伙伴又开发了一款竞拍商城的源码&#xff0c;是此系统的源头开发者&#xff0c;本系统是前后端分离的架构&#xff0c;前端php&#xff0c;后端uniapp&#xff0c;系统现在是持续的在更新中&…

libcity笔记: HSTLSTMEncoder

1 __init__ 2 encode 得到的内容如下&#xff1a; data_feature的内容&#xff1a; 一共有多少个location1【包括pad的一个】最长的时间间隔&#xff08;秒&#xff09;最长的距离间隔&#xff08;千米&#xff09;多少个useer idpadding 的locationidpad_item的内容 location…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

React 第三十一章 前端框架的分类

现代前端框架&#xff0c;有一个非常重要的特点&#xff0c;那就是基于状态的声明式渲染。如果要概括的话&#xff0c;可以使用一个公式&#xff1a; UI f&#xff08;state&#xff09; state&#xff1a;当前视图的一个状态f&#xff1a;框架内部的一个运行机制UI&#xff1…

计算机视觉——基于改进UNet图像增强算法实现

1. 引言 在低光照条件下进行成像非常具有挑战性&#xff0c;因为光子计数低且存在噪声。高ISO可以用来增加亮度&#xff0c;但它也会放大噪声。后处理&#xff0c;如缩放或直方图拉伸可以应用&#xff0c;但这并不能解决由于光子计数低导致的低信噪比&#xff08;SNR&#xff…

从头理解transformer,注意力机制(下)

交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考&#xff0c;然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…

【图论 回溯 广度优先搜索】126. 单词接龙 II

本文涉及知识点 图论 回溯 深度优先搜索 广度优先搜索 图论知识汇总 LeetCode 126. 单词接龙 II 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化&#xff0c;一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 这样的单词序…