关于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来操作二进制序列。

最新文章

  1. 原生js下拉菜单
  2. PHP 小方法之 二维数组排序
  3. python多线程生成缩略图
  4. TCP服务器不回复SYN的问题
  5. ECSHOP 支付宝发货确认接口,记录支付宝返回的交易号
  6. feof()
  7. Git 命令速查表
  8. Appium Android Bootstrap源码分析之命令解析执行
  9. hdu 1536 S-Nim (简单sg函数)
  10. java实现——003二维数组中的查找
  11. VBA /VB/VB中合成分散数据方法
  12. const 相关知识 const和指针、const和引用
  13. 【一天一道LeetCode】#73. Set Matrix Zeroes
  14. echarts堆叠图添加总量
  15. cocos2d-x学习之路(三)——精灵与动作
  16. JQuery输入框获取/失去焦点行为
  17. RocketMQ:Cannot allocate memory
  18. Wormholes POJ 3259(SPFA判负环)
  19. 【动态规划】【滚动数组】【搜索】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) D. Field expansion
  20. Mavlink消息包解析

热门文章

  1. PLSQL Developer 12 注册码
  2. 添加一个js扩展方法
  3. prometheus监控redis
  4. js实现table合并相同列单元格
  5. jQuery实现页面回到顶部功能
  6. 树莓派安装samba服务
  7. leetcode记录-反转整数
  8. document ready
  9. 《Java 程序设计》课堂实践二
  10. ## 20155336 2016-2017-2《JAVA程序设计》第十周学习总结