python3 byte_「Python3学习笔记」读书笔记—字节数组
生物都是由细胞构成的,但在我们普通人眼中,并不会将鸡、鸭、狗、鸟这些动物当作细胞看待,因为对待事物的角度决定了我们更关心生物的外在形状和行为,而不是它的组织构成。
从计算机底层实现来说,所有的数据都是二进制字节序列。但为了更好地表达某个逻辑,计算机科学家们将数据抽象成不同的类型,犹如细胞和动物的关系。在编程语言中,对于字节序列,我们更关心的是它的存储和传输方式;而面向对象时,则着重于它的抽象属性。尽管两面一体,但从不混为一谈。
同为不可变序列类型,bytes 与 str 有着非常相似的操作方式。其同样支持加法、乘法等运算符。
>>> a = b"abc"
>>> b = a + b"def"
>>> b
b'abcdef'
>>> b.startswith(b"a")
True
>>> b.upper()
b'ABCDEF'
>>> b"abc" * 2
b'abcabc'
相比于 bytes 类型的一次性分配内存,bytearry 可按需扩张,更适合作为可读写缓冲区使用。如有必要,还可为其提前分配足够的内存,避免中途扩张造成的额外消耗。
>>> b = bytearray(b"abc")
>>> len(b)
3
>>> id(b)
4473445824
>>> b.append(ord("d"))
>>> b.extend(b"e")
>>> id(b)
4473445824
内存视图
当我们要引用字节数据的某个片段的时候,需要考虑到:是否会有数据复制行为?是否能同步修改?
>>> a = bytearray([0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16])
>>> x = a[2:5] # 引用片段
>>> x
bytearray(b'\x12\x13\x14')
>>> a[3] = 0xEE # 修改原数据
>>> a
bytearray(b'\x10\x11\x12\xee\x14\x15\x16')
>>> x # 并未同步修改,可以看出仅仅只是数据复制
bytearray(b'\x12\x13\x14')
为什么需要引用某个片段,而不是整个对象呢?
以自定义网络协议为例,通常由标准头和数据体两部分组成。如要验证数据是否被修改,总不能将整个包作为参数交给验证函数吧。因为如果将整个包传给函数,这势必要求该函数了解协议包的结构,这显然是不合理的设计,而复制数据体又可能导致重大性能开销,同样得不偿失。
在 Python 中没有指针的概念,外加内存安全模型的限制,要做到这一点并不容易。此时,可以借助一种名为内存视图(Memory View)的方式来访问底层内存数据。
内存视图要求目标对象支持缓冲协议(Buffer Protocol),内存视图直接引用目标内存,没有额外的复制行为,因此,可读取最新的数据,在目标对象允许的情况下,还可以执行写操作。
>>> a = bytearray([0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16])
>>> v = memoryview(a) # 完整的视图
>>> x = v[2:5] # 视图片段
>>> x.hex()
'121314'
>>> a[3] = 0xee # 对原数据进行修改,可通过视图观察到
>>> a
bytearray(b'\x10\x11\x12\xee\x14\x15\x16')
>>> x.hex()
'12ee14'
>>> x[1] = 0x13 # 因为引用了相同的内存区域,可通过视图修改原数据
>>> a
bytearray(b'\x10\x11\x12\x13\x14\x15\x16')
当然,能够通过视图修改原数据,还必须得看原对象是否允许。
>>> a = b"\x10\x11" # bytes 是不可变类型
>>> v = memoryview(a)
>>> v[1] = 0xEE
Traceback (most recent call last):
File "", line 1, in
TypeError: cannot modify read-only memory
如果要复制视图数据,可调用 tobytes、tolist 方法,复制后的数据与原对象无关,同样不会影响视图本身。
>>> a = bytearray([0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16])
>>> v = memoryview(a)
>>> x = v[2:5]
>>> b = x.tobytes() # 复制并返回视图数据
>>> b
b'\x12\x13\x14'
>>> a[3] = 0xEE # 对原数据进行修改
>>> a
bytearray(b'\x10\x11\x12\xee\x14\x15\x16')
>>> b # 不影响复制数据
b'\x12\x13\x14'
除了上述这些,内存视图还为我们提供了一种内存管理手段,比如:通过 bytearray 预申请很大的一块内存,随后以视图方式将不同片段交给不同的逻辑使用。因为逻辑不能跨界访问,故此可以实现简易的内存分配器模式。对于 Python 这种限制较多的语言,合理使用视图可在不同使用 ctypes 等复制扩展的前提下,改善算法类型。
可使用 memoryview.cast、struct.unpack 将字节数组转换为目标类型。
从博客搬运到简书:原文链接
python3 byte_「Python3学习笔记」读书笔记—字节数组相关推荐
- 《Python学习手册》读书笔记
原文地址为: <Python学习手册>读书笔记 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<P ...
- 「程序员的思维修炼——开发认知潜能的九堂课」读书笔记
书名:程序员的思维修炼--开发认知潜能的九堂课 作者:(美) 亨特 (Andy Hunt) 译者:崔康 关于本书 本书从德雷福斯模型入手,阐释了程序工程师发展的五个阶段:接着从阶段间的特征中引出 L ...
- python有道云笔记_你很需要的,一个一键导出「有道云笔记」所有笔记的功能
一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记. ...
- 《鸟哥的Linux私房菜-基础学习篇》读书笔记
写在前面 嗯,来这边实训,青软的孔老师给装了一个有Linux系统的虚拟机,讲了一些Linux的常识,决定去看这本书,了解一些Linux的知识 . 加油生活^_^,嗯,希望以后的生活不会枯燥哎!!摘条 ...
- python有道云笔记_一键导出「有道云笔记」所有笔记
一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得的 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记 ...
- python 有道云笔记-一键导出「有道云笔记」所有笔记
一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得的 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记 ...
- python 有道云笔记-你很需要的,一个一键导出「有道云笔记」所有笔记的功能...
一.出发点 原来一直是有道云笔记的忠实用户,后面接触到了所见即所得 Typora,有点用不惯有道云笔记了,想着有什么法子能电脑本地文件和有道云笔记同步,这样电脑使用 Typora,手机使用有道云笔记. ...
- tensorflow gpu利用率低_「动手学习Tensorflow」- Tensorflow综述I
" 一文概览Tensorflow方方面面." 大家好,我是人工智能工程师Alpha浪. 今天,我们开始「动手学习Tensorflow - Tensorflow 综述」部分. 快速学 ...
- 你想学习吗?你会学习吗?你知道该如何学习吗?学习之道-读书笔记
作者: [美] 芭芭拉·奥克利(Barbara Oakley):出版社: 机械工业出版社 :出版年: 2016-11 前言 我们的大脑潜力无穷,却没有配备使用手册 思考:大脑没有使用说明手册,想要很好 ...
最新文章
- 修改git的远程仓库命令
- /* * 编程第二题(20分): 	一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第十次落地时,共经过多少米?第十次反弹多高? */
- 【Paper】2009_Controllability of Multi-Agent Systems from a Graph-Theoretic Perspective
- 使用增量备份修复DG中的GAP
- [C++11]常量表达式函数
- pythonapp自动化_GitHub - qdyxmas/PyAutoTest: python Autotest UI自动化 APP自动化 HTTP接口自动化...
- 《三体》动画版官宣!B站出品 刘慈欣“倒吸一口凉气”
- 如何计算虚拟化vcpu_首次公开:腾讯云虚拟化技术原理及可用性提升实践
- linux备份mysql怎样操作,Linux下自动备份MySQL数据库详细操作步骤(转载)
- solr6.6初探之主从同步
- 如何用OBS录制Mac系统声音
- OPENCV 实现png绘制,alpha通道叠加。
- C# Emoji在Web端显示
- 各行业的英语术语(绝对精华 1)
- java中使用poi导出ppt(图片和表格)
- 纯js实现减速滚动置顶效果
- 抖音是怎么动摇美国国本的?
- CSRF攻击原理及防护
- 房贷利息怎么算, 千万别被砖家叫兽误导
- 网站分析-网站分析工具-免费网站分析软件
热门文章
- R语言dplyr包使用anti_join()函数返回在一个dataframe中存在而在另一个dataframe中没有匹配值的所有行实战
- linux文件查找命令find、which、locate、whereis 和type
- html块元素设置min-width,css min-width属性怎么用
- MySQL数据库have_openss_MySQL 关于OpenSSL证书支持检查方式
- ISLR_StatisticalLearning
- R Learnilng 十八讲1-6
- mysql为什么直接8.0_为什么要迁移到MySQL8.0?
- linux系统中安装java
- 多表查询事务DCL权限管理
- Chart.js-线形图分析(参数分析+例图)