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。

欢迎关注我的微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07 - java 方法里面的 return

Java 方法里面的 return return 之函数返回值 public static int sum(a, b) {return a b; }return 之结束方法 Scanner sc new Scanner(System.in): int num sc.nextInt();if (num 5) {return;System.out.println("哈哈哈,我是不会执行的"); // 函数遇…

世外桃源六python_六年匠心 桃花源记6月1日全民狂欢

六年匠心独运,烂漫之约!深圳淘乐携手并肩云畅游戏倾情打造出的人民良知连击手游《桃花源记》昨天宣布告一段落为期一周的小彩蛋检测!小彩蛋检测打开至今,诸位少主呼叫队友飘缈世外桃源的情绪高涨,网络服务器因而一度出現了满员的隆重开幕。而…

PTA 最小生成树-kruskal

7-92 最小生成树-kruskal 分数 10 全屏浏览题目 作者 任唯 单位 河北农业大学 题目给出一个无向连通图,要求求出其最小生成树的权值。 温馨提示:本题请使用kruskal最小生成树算法。 输入格式: 输出格式: 输出一个整数表示最小生成树的各边的长度之和。…

06 - java 方法

Java 方法 一个方法可以重复使用很多次,减少不必要的冗余,以及重复很多次不必要的操作让整个程序看起来模块化 public static void main (String[] args) {Scanner sc new Scanner(System.in);int num sc.nextInt();switch (num) {case 1: int[] arr…

Spring系列:父子容器详解

又一次被面试官带到坑里面了。 面试官:springmvc用过么? 我:用过啊,经常用呢 面试官:springmvc中为什么需要用父子容器? 我:嗯。。。没听明白你说的什么。 面试官:就是controll…

05 - 基本排序

01-冒泡排序 public static int[] bubbleSort(int[] arr) {for (int i 0; i < arr.length - 1; i) {for (int j 0; j < arr.length - i; j) {if (arr[i] > arr[i 1]) {// 两两交换int temp arr[i];arr[i] arr[i 1];arr[i 1] temp;}}}return arr; }02-选择排序…

java实现单链表

链表是java数据结构中一种很基础很常见却也很重要的数据结构&#xff0c;JDK中许多内置jar包基于单链表实现&#xff0c;比如像我们熟悉的linkedList等&#xff0c;为什么要使用链表呢&#xff1f; 我们知道java中很多集合的底层是基于数组实现的&#xff0c;数组有一个很重要…

sql 两表数据合并_多表查询SQL语句

本篇文章中主要讲述以下内容&#xff1a;一、表的加法合并两张表的过程&#xff1a;然后运用sql语句&#xff1a;select 课程号,课程名称 from course union select 课程号,课程名称 from course1以上子句会把两个表中重复数据删除。要想不删除重复的行&#xff0c;则需要在上面…

04 - java 运算符

位移运算符 有符号左移 << int a 1 << 2; System.out.println(a); // 4 > 1 * 2 ^ 2无符号左移 <<< 右移 >> int a 1 >> 2; System.out.println(a); // 0 > 1 / 2 ^ 2cpu计算位移、与或非的速度非常快

angularjs增删改查数据_MongoDB数据读写操作(增删改查)总结

《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、javascript 等目前流行的计算机、大数据编程语言&#xff0c;希望大家以后关注本头条号更多的内容。一、在执行mongo.exe文件后&#xff0c;进入MongoDB的shell 操作1、创建一个数据库use users2、查…

SpringAop与AspectJ的联系与区别____比较分析 Spring AOP 和 AspectJ 之间的差别

SpringAop与AspectJ的联系与区别 区别 AspectJ AspectJ是一个面向切面的框架&#xff0c;它扩展了Java语言。AspectJ定义了AOP语法&#xff0c;所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 spring aop Spring提供了四种类型的Aop支持 * 基于经典的…

ssrf漏洞内网渗透_渗透小白看了也能明白的SSRF

什么是SSRF含义服务器端请求伪造&#xff08;SSRF&#xff09;是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)攻击者能够利用目标帮助攻击者访问其他想要攻击的目标攻击者要求服务器为他…

高并发之服务降级和服务熔断____服务降级、熔断、限流的区别

高并发之服务降级和服务熔断 服务降级&#xff1a; 服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级&#xff0c;以此环节服务器的压力&#xff0c;以保证核心任务的进行。 同时保证部分甚至大部分任务客户能得到正确的相应。也就是当前的请求处理…

03 - 变量的数据类型

1. 数据类型 java的数据类型可以分为四类八种 整形 byte 8位 – 1字节 – 取值范围是 (-128~127) > 11111111~10000000 第一位称作符号位&#xff0c;以1开头的是负数&#xff0c;以0开头的是整数正数的源码、反码、补码都是本身 00011100负数的反码 – 除了符号位&#xf…

python操作word文档中的图片_Python操作word文档插入图片和表格的实例演示

前言P6Q免费资源网图片是Word的一种特殊内容&#xff0c;这篇文章主要介绍了关于Python操作word文档&#xff0c;向里面插入图片和表格的相关内容&#xff0c;下面话不多说了&#xff0c;来一起看看详细的代码P6Q免费资源网实例代码&#xff1a;P6Q免费资源网# -*- coding: UTF…

Controller数据导出Excel 详细教程——easypoi-base,easypoi-web,easypoi-annotation

Controller获取数据导出Excel&#xff0c;详细教程 1&#xff1a;导入对应依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.3</version></dependency><dependency&g…

02 - java 标识符命名规范

一、java总体命名规范 名称只能由字母、数字、下划线、$符号组成不能以数字开头名称不能使用java中的关键字坚决不允许出现中文 具体还要查看《阿里巴巴java开发手册》

python求均方根_python之MSE、MAE、RMSE的使用

我就废话不多说啦&#xff0c;直接上代码吧&#xff01;target [1.5, 2.1, 3.3, -4.7, -2.3, 0.75]prediction [0.5, 1.5, 2.1, -2.2, 0.1, -0.5]error []for i in range(len(target)):error.append(target[i] - prediction[i])print("Errors: ", error)print(err…

01 - java 开始

Java 的优势 java适合做web后台 java配置环境的时候 java的安装目录&#xff1a;JAVA_HOMEjdk的安装目录&#xff1a;%JAVA_HOME%\bin java的执行机制 先将.java的文件用 javac 编译成 .class的字节码文件再将这些 .class 的字节码文件用 java 执行&#xff08;执行的是文…

python中__init__方法_关于python中__init__方法理解

在理解__init__方法之前,我们需要搞明白,什么时候才需要用到的这个方法什么是__init__&#xff1f;__init__方法在python中是类的初始化&#xff0c;通俗来讲&#xff0c;就是每次只要你去创建一个类的实例对象的时候&#xff0c;这个对象就会有初始化相关的属性什么时候需要去…