python memoryview_memoryview的用法
本来第一次看《流畅的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的用法相关推荐
- 简单介绍Python中异常处理用法
这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- python matplotlib 简单用法
python matplotlib 简单用法 具体内容请参考官网 代码 import matplotlib.pyplot as plt import numpy as np # 支持中文 plt.rc ...
- (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案
(转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 参考文章: (1)(转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 (2)ht ...
- python装饰器实例-Python装饰器用法实例总结
本文实例讲述了Python装饰器用法.分享给大家供大家参考,具体如下: 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能, ...
- python所有函数用法_Python函数使用方法(高级用法)
前面章节,已经介绍了 Python 函数的所有基本用法和使用注意事项.但是,Python 函数的用法还远不止此,Python 函数还支持赋值.作为其他函数的参数以及作为其他函数的返回值. 首先,Pyt ...
- python的property用法_python @property的用法及含义全面解析
在接触python时最开始接触的代码,取长方形的长和宽,定义一个长方形类,然后设置长方形的长宽属性,通过实例化的方式调用长和宽,像如下代码一样. class Rectangle(object): de ...
- python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- Python Matplotlib基本用法
Python Matplotlib基本用法 1. 认识Matploblib 1.1 Figure 1.2 Axes 1.3 Multiple Axes 1.4 Axes Vs .pyplot 2. 基 ...
最新文章
- 基于Guava实现的文件复制
- XGBOOST带试验源码
- Mybatis和Spring集成 sessionFactory.openSession() 事务不生效问题
- App设计灵感之十二组精美的租车类App设计案例
- ASP.NET图片上传(配合jquery.from.js 插件)
- partial、struct、interface与C#和CLR的关系
- Typora + PicGo + Aliyun OSS + CSDN
- DVB开发之OTA升级
- 课程题目 : 1003. 简单字符串匹配
- 使Docker Container支持运行SWT程序
- 滑模控制学习笔记(二)
- 简单java数组程序_最简单易懂的java数组排序方法整理
- 只需5分钟-----手把手教你如何注册美国AppleId账号
- 数学——每日一题7 1.14 利用定积分的定义求极限
- 记车架号识别程序部署参考文档
- 高通SDX12:SFE(shortcut-fe)软加速驱动效果调测
- 可路由计算引擎实现前置数据库
- 美国 普渡 计算机科学本科,美国大学本科普渡大学CS怎么样?
- 利用Nginxcp为cPanel/WHM服务器开启nginx支持
- 二十七、动词不定式 万事开头难
热门文章
- 怎么导出oracle库,【DG】怎么从Oracle备库导出数据
- 带有示例的Python列表reverse()方法
- int?id与id??1 的意思
- Android studio小问题解决
- JQuery Datatables 动态配置参数异步加载数据
- websocket一直无法链接_.NET Core 实现基于Websocket的在线聊天室
- 转学到斯坦福大学计算机专业,斯坦福大学转学申请条件有哪些?
- 上位机与1200组态步骤_西门子1200的HSC的应用实例!
- php导入json文件_[php]导入超大json文件
- 达梦数据库导入oracle数据_达梦数据库助力加速石油石化行业数字化转型升级