本来第一次看《流畅的python》觉得这部分没用,就跳过去,后面又出现,回头看还是一知半解,查了诸多资料,好像有一点明白了,立下帖子。

1、memoryview

memoryview()

函数返回给定参数的内存查看对象(memory view)。

所谓内存查看对象,是指对支持缓冲区协议的数据进行包装,在不需要复制对象基础上允许Python代码访问。

可以简单理解为就是对内存地址的直接访问。

memoryview可以对对象进行索引或者切片,不过切片的返回结果为一个子memoryview对象:

import array

# 创建一个signed short 类型数组,占2bytes

nums = array.array('h', list(range(-2, 3)))

mem = memoryview(nums)

print(len(mem)) # 5

print(mem[0]) # -2

print(mem[1:4]) #

mem相当于nums在内存中的表示形式,但是属于不同的对象:

>>>mem is nums

False

>>>mem == nums

True

同样,memoryview对象有tolist方法可以转换为列表:

>>>mem.tolist()

[-2, -1, 0, 1, 2]

2、memoryview.cast

memoryview.cast

会把同一块内存里的内容打包成一个全新的memoryview对象。

>>>mem_oct = mem.cast('B')

>>>mem.nbytes == mem_oct.nbytes

True

>>>mem.itemsize == mem_oct.itemsize

False

在转换以后,所占字节数保持不变,但是单个元素的所占字节由原来的2个变成1个(‘h’ --> ‘B’)。

Type code

C Type

Python Type

Minimum size in bytes

‘c’

char

character

1

‘b’

signed char

int

1

‘B’

unsigned char

int

1

‘u’

Py_UNICODE

Unicode character

2 (see note)

‘h’

signed short

int

2

‘H’

unsigned short

int

2

‘i’

signed int

int

2

‘I’

unsigned int

long

2

‘l’

signed long

int

4

‘L’

unsigned long

long

4

‘f’

float

float

4

‘d’

double

float

8

将mem_oct转换为list,你会发现mem_oct居然包含10个元素:

>>>mem_oct.tolist()

[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]

所包含的元素也很奇怪,这个就涉及到存储的一些知识,为了将将符号位和数值域统一处理,同时加法和减法也可以统一处理,计算机系统中数值一律用补码来表示和存储。

以-2为例,初始设置其数据类型为占用两个字节的’long’,其原码是1000 0000 0000 0010,而在计算机存储的是1111 1111 1111 1110,其低八位为254,高8位为255,所以知道mem_oct前两个元素从哪里来了吧。

对于2来说,原码为0000 0000 0000 0010,补码为其本身(正数的补码与原码一致),所以转换后为2,0。

欢迎关注我的微信公众号

python memoryview_memoryview的用法相关推荐

  1. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  2. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  3. python matplotlib 简单用法

    python matplotlib 简单用法 具体内容请参考官网 代码 import matplotlib.pyplot as plt import numpy as np # 支持中文 plt.rc ...

  4. (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案

    (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 参考文章: (1)(转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 (2)ht ...

  5. python装饰器实例-Python装饰器用法实例总结

    本文实例讲述了Python装饰器用法.分享给大家供大家参考,具体如下: 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能, ...

  6. python所有函数用法_Python函数使用方法(高级用法)

    前面章节,已经介绍了 Python 函数的所有基本用法和使用注意事项.但是,Python 函数的用法还远不止此,Python 函数还支持赋值.作为其他函数的参数以及作为其他函数的返回值. 首先,Pyt ...

  7. python的property用法_python @property的用法及含义全面解析

    在接触python时最开始接触的代码,取长方形的长和宽,定义一个长方形类,然后设置长方形的长宽属性,通过实例化的方式调用长和宽,像如下代码一样. class Rectangle(object): de ...

  8. python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  9. Python Matplotlib基本用法

    Python Matplotlib基本用法 1. 认识Matploblib 1.1 Figure 1.2 Axes 1.3 Multiple Axes 1.4 Axes Vs .pyplot 2. 基 ...

最新文章

  1. 基于Guava实现的文件复制
  2. XGBOOST带试验源码
  3. Mybatis和Spring集成 sessionFactory.openSession() 事务不生效问题
  4. App设计灵感之十二组精美的租车类App设计案例
  5. ASP.NET图片上传(配合jquery.from.js 插件)
  6. partial、struct、interface与C#和CLR的关系
  7. Typora + PicGo + Aliyun OSS + CSDN
  8. DVB开发之OTA升级
  9. 课程题目 : 1003. 简单字符串匹配
  10. 使Docker Container支持运行SWT程序
  11. 滑模控制学习笔记(二)
  12. 简单java数组程序_最简单易懂的java数组排序方法整理
  13. 只需5分钟-----手把手教你如何注册美国AppleId账号
  14. 数学——每日一题7 1.14 利用定积分的定义求极限
  15. 记车架号识别程序部署参考文档
  16. 高通SDX12:SFE(shortcut-fe)软加速驱动效果调测
  17. 可路由计算引擎实现前置数据库
  18. 美国 普渡 计算机科学本科,美国大学本科普渡大学CS怎么样?
  19. 利用Nginxcp为cPanel/WHM服务器开启nginx支持
  20. 二十七、动词不定式 万事开头难

热门文章

  1. 怎么导出oracle库,【DG】怎么从Oracle备库导出数据
  2. 带有示例的Python列表reverse()方法
  3. int?id与id??1 的意思
  4. Android studio小问题解决
  5. JQuery Datatables 动态配置参数异步加载数据
  6. websocket一直无法链接_.NET Core 实现基于Websocket的在线聊天室
  7. 转学到斯坦福大学计算机专业,斯坦福大学转学申请条件有哪些?
  8. 上位机与1200组态步骤_西门子1200的HSC的应用实例!
  9. php导入json文件_[php]导入超大json文件
  10. 达梦数据库导入oracle数据_达梦数据库助力加速石油石化行业数字化转型升级