• Fluent Python: memoryview


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

  • 相关阅读:
    beta冲刺—— Day 4
    beta冲刺—— Day 3
    beta冲刺—— Day 2
    刚下飞机——Beta阶段随笔集合
    刚下飞机——Alpha冲刺
    刚下飞机——Beta答辩博客
    刚下飞机——用户使用调查报告
    刚下飞机——Beta冲刺总结博客
    Beta冲刺(7/7)
    Beta冲刺(6/7)
  • 原文地址:https://www.cnblogs.com/z-joshua/p/7607323.html
Copyright © 2020-2023  润新知