关于Python的memoryview内置类,搜索国内网站相关博客后发现对其解释都很简单,

我觉得学习一个新的知识点一般都要弄清楚两点:

1, 什么时候使用?(也就是能解决什么问题) 2,如何使用?

对照Fluent Python一书2.9.2 以及网上相关资料后,对memoryview内置类做一些总结:

(1)什么时候应该使用memoryview内置类

Travis Oliphant在statkoverflow上是如此回答的:

# A memoryview is essentially a generalized NumPy array structure in
# Python itself (without the math). It allows you to share memory between # data-structures (things like PIL images, SQLlite data-bases, NumPy
# arrays, etc.) without first copying. This is very important for large data
# sets.

内存视图其实是泛化和去数学化的Numpy数组,它让你在不需要复制内容的前提下,在数据结构之间共享内存,其中数据结构可以是任何形式的,比如PIL图片,SQLite数据库,Numpy的数组等等

这个功能在处理大型数据集合的时候非常重要。

memoryview.cast()方法的概念跟数组模块类似,能用不同的方式读写同一块内存,而且内容字节不会随意移动,听上去和C语言的类型转换的概念很像。

(2) 如何使用memoryview:

我们还是通过示例来看看如何使用memoryview(利用memoryview精准的修改一个数组的某个字节):

我们先定义一个数组,里面每一个元素都是unsigned short类型:

>>> numbers = array('h', [-2, -1, 0, 1, 2])  # # type 'h': signed short

然后把这个数组传入memoryview的构造函数创建实例, 并查看memoryview实例的长度和成员:

>>> mem_short = memoryview(numbers)
>>> len(mem_short)
5
>>> mem_short[0]
-2
>>> mem_short.tolist()
[-2, -1, 1024, 1, 2] >>> len(numbers)
5
>>> numbers[0]
-2

从控制台的输出可以看到memoryview的元素个数和内容与array.array是一样的。

接下来我们将mem_short的内容转换为‘B’类型,即unsighed char类型,并查看其内容

>>> mem_octets = mem_short.cast('B')  # type 'B': unsigned char
>>> mem_octets.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]

把位于位置5的unsighed char内容赋值为其他值,比如4:

>>> mem_octets[5] = 4

我们并没有对numbers 这个array实例操作,但是我们查看其内容却发现numbers已被修改:

>>> numbers
array('h', [-2, -1, 1024, 1, 2])

从上面的示例我们可以看出如何利用memoryview来操作二进制序列。

Fluent Python: memoryview的更多相关文章

  1. 《Fluent Python》---一个关于memoryview例子的理解过程

    近日,在阅读<Fluent Python>的第2.9.2节时,有一个关于内存视图的例子,当时看的一知半解,后来查了一些资料,现在总结一下,以备后续查询: 示例复述 添加了一些额外的代码,便 ...

  2. 学习笔记之Fluent Python

    Fluent Python by Luciano Ramalho https://learning.oreilly.com/library/view/fluent-python/97814919462 ...

  3. 「Fluent Python」今年最佳技术书籍

    Fluent Python 读书手记 Python数据模型:特殊方法用来给整个语言模型特殊使用,一致性体现.如:__len__, __getitem__ AOP: zope.inteface 列表推导 ...

  4. Python memoryview() 函数

    Python memoryview() 函数  Python 内置函数 描述 memoryview() 函数返回给定参数的内存查看对象(Momory view). 所谓内存查看对象,是指对支持缓冲区协 ...

  5. Python深入学习之《Fluent Python》 Part 1

    Python深入学习之<Fluent Python> Part 1 从上个周末开始看这本<流畅的蟒蛇>,技术是慢慢积累的,Python也是慢慢才能写得优雅(pythonic)的 ...

  6. Fluent Python: Classmethod vs Staticmethod

    Fluent Python一书9.4节比较了 Classmethod 和 Staticmethod 两个装饰器的区别: 给出的结论是一个非常有用(Classmethod), 一个不太有用(Static ...

  7. Fluent Python: @property

    Fluent Python 9.6节讲到hashable Class, 为了使Vector2d类可散列,有以下条件: (1)实现__hash__方法 (2)实现__eq__方法 (3)让Vector2 ...

  8. Fluent Python: Mutable Types as Parameter Defaults: Bad Idea

    在Fluent Python一书第八章有一个示例,未看书以先很难理解这个示例运行的结果,我们先看结果,然后再分析问题原因: 定义了如下Bus类: class Bus: def __init__(sel ...

  9. 流畅的Python (Fluent Python) —— 第二部分01

    2.1 内置序列类型概览 Python 标准库用 C 实现了丰富的序列类型,列举如下. 容器序列 list. tuple 和 collections.deque 这些序列能存放不同类型的数据. 扁平序 ...

随机推荐

  1. C# 反射 Reflection Assembly

    本章节带来的是反射,反射反射程序员的快乐. 一.什么叫反射 反射:是.net Framework提供给的一个方面metadata的帮助类,可以获取信息并且使用 反射的有点:动态 反射的缺点:1:稍微麻 ...

  2. nginx详解反向代理、负载均衡、LNMP架构上线动态网站

    简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.N ...

  3. VirtualBox + CentOS详细安装教程

    一.前期工作准备 电脑虚拟化开启(必要工作)大致流程: a.电脑开机时长按F12(F10)进入BIOS界面; b.依次选择Configuratio > Intel Virtual Technol ...

  4. 什么是ajax和json,说说他们的优缺点

    ajax异步传输的js和xml.实现页面无刷新状态更新页面和异步提交 所谓异步,简单解释就是:向服务器发送请求的时候,我们不必等待结果,而是同时做其他的事情,等到有了结果后它自己会根据设定进行后续操作 ...

  5. golang学习总结

    目录 1. 初识go语言 1.1 Hello World 1.2 go 数据类型 布尔: 整型: 浮点型: 字符类型 字符串型: 复数类型: 1.3 变量常量 局部变量: 全局变量 常量 1.5 字符 ...

  6. C语言链栈

    链栈与链表结构相似 typedef int elemtype; typedef struct linkedStackNode{ elemtype e; struct linkedStackNode * ...

  7. linux编程实践:实现pwd命令

    内核为每个目录都设置了一个指向自己的i节点入口,即".",还有一个指向其父目录i节点的入口,即"..",我们首先获取当前目录的i节点编号,但是并不能知道当前目录 ...

  8. 20155305 2016-2017-2 《Java程序设计》实验四 Android程序开发基础

    实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组件.布局管理器的使用: 掌握Android中事件处理机制 实验 ...

  9. 20155320 实验二 Java面向对象程序设计

    20155320 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  10. PHP 0817PHP 0817 (PHP, Exploit) writeup

    作为一只ctf小白,这个题看到之后真是丝毫没有思路.虽然能基本理解php,但还是没能顺利答出,最后直接进行了搜索. 虽然做技术,“固执”是优点.但是出于对自身自身情况的了解,我觉得现阶段看题解还是很有 ...