美文网首页
2018-10-25 026 不用列表 D

2018-10-25 026 不用列表 D

作者: 杜若飞er | 来源:发表于2018-10-25 20:19 被阅读4次
    内存视图

    今天要介绍的是——内存视图(memoryview)。
    内存视图的主要功能就是让我们在不复制内容的情况下对同一个数组的不同切片进行操作,在回答内存视图作用时,Travias Oliphant(此人是numpy之父)这样说:

    Q: When should a memory view be used?
    A: 内存视图其实是一种泛化和去数学化的numpy数组,它让你在不需要复制内容的前提下,在数据结构之间共享内存。其中的数据结构可以是任何形式,比如图片、数据库和数组,等等。这个功能在处理大型数据集合的时候非常重要。

    其实写这一部分,本菜鸡还是有点打怵的,虽然有时候我会查有些语句的汇编,但对于再往底层的内容,实际上我是一个头两个大的,但是其实memoryview在逻辑上并不难理解:
    可以这样做初步的想象,我们经常会面对很多看上去截然不同的数据类型,但它们本质上都是同根同源的,因此完全可以把共同的“根”封装起来提供一个长出“枝桠”的端口,在需要的时候长出不同的样子,这其实有点像C-Style语言中的类型转换,我们把同一块物理层的内存封装起来打包成一个新的memoryview对象——而我们的内存视图,某种程度上是会“七十二变”的。
    看一个例子:

    1    numbs = array.array('h', [-2,-1,0,1,2])
    2    memo = memoryview(numbs)
    3    print(len(memo))
    4    memo_oct = memo.cast('B')
    5    print(memo_oct.tolist())
    6    memo_oct[5] = 4
    7    print(numbs)
    

    老办法,逐行解释:
    1 希望读者没有忘记数组定义的方法;
    2 我们使用已经成型的数组搞出来一个memoryview;
    3 输出5,是这个memo的长度;
    4 我们又搞出来一个memo_oct,这次是把元素都变成了无符号字符('B')
    5 用列表形式输出,结果是[254,255,255,255,0,0,1,0,2,0] 【注1】
    6 赋值语句,没啥说的;
    7 输出一下numbs(我们可没对它进行直接操作,但是)结果是[-2,-1,1024,1,2]
    很明显看得出,使用memoryview时不同的东西指向的是同一个根本——因此可以做到改一个则全变化。
    【1】:元素都变成了无符号字符,但数字又确实有正负符号,就在元素后面添一位标志出来;

    二进制操作

    本来打了好大一段,是利用memoryview和struct操作二进制——我还专门翻到后半篇详细研究过,不过转念一想还是介绍struct时候再说吧……


    多说两句

    我发现很多所谓的“从入门到精通”或者“从零开始的某某课程”系列,实际上都不是真正从一无所有开始的,当然,也不是说学习语言必须要买一台好电脑之类的——我说的不是硬件的问题,而是这些书好像讲的东西都基于你已经精通(起码是了解)一门其他的语言,对起码的流程控制之类的东西有概念,但是从我的经验来看,编程是所有知识中非常需要“想通”的一个,如果不是最需要的话,而一旦想通了,又会对想通前的问题产生一种奇怪的情绪:

    “我唯一不懂的,就是这群XX为什么不懂。”

    这是我上中学时候有个老师告诉我的,用在编程上再合适不过了,对一个完全从零开始的语言学习者(我指的是没经过任何哪怕是“熏陶”),想解释为什么会是这样,真不是一件容易的事。
    所以在这里还是推荐一本小书吧……
    《C++程序设计基础》
    诸位,好好听老师讲——他们才是真正的大佬。

    相关文章

      网友评论

          本文标题:2018-10-25 026 不用列表 D

          本文链接:https://www.haomeiwen.com/subject/iunctqtx.html