『Numpy』内存分析_利用共享内存创建数组
引、内存探究常用函数
id(),查询对象标识,通常返回的是对象的地址
sys.getsizeof(),返回的是 这个对象所占用的空间大小,对于数组来说,除了数组中每个值占用空间外,数组对象还会存储数组长度、数组类型等其他信息
numpy.ndarray.ctypes.data属性,返回numpy数组的内存位置
array.array.buffer_info(),数组对象的内存信息,返回元素起始地址和元素个数
help(array.buffer_info)
'''
buffer_info(self, /)
Return a tuple (address, length) giving the current memory address and the length in items of the buffer
used to hold array's contents.
'''
numpy.ndarray.nbytes,获取数组中存储的值的占用空间大小
numpy.ndarray.items,获取数组中每个值的占用空间大小
部分函数试用如下,有意思的是对numpy数组中元素的迭代,它们的id是两个循环出现的地址,原因不明,
a = np.array([1,2,3,4,5]) a.ctypes.data
# 2199487215904 id(a)
# 2199565580288 sys.getsizeof(a)
# 116 a.nbytes
# 20 a.itemsize
# 4 for i in a:
print(id(i), type(i), i)
# 2199565034888 <class 'numpy.int32'> 1
# 2199565034912 <class 'numpy.int32'> 2
# 2199565034888 <class 'numpy.int32'> 3
# 2199565034912 <class 'numpy.int32'> 4
# 2199565034888 <class 'numpy.int32'> 5
一、使用array.array和numpy.frombuffer实现动态数组
利用array.array数组对象的内存是确定连续的特性(这也是list为什么不行的原因,实际上array的buffer_info方法就可以查看内存占用情况,返回),使用np访问这块内存,并指定解析方式,从内存创建数组,
从内存创建数组
此时两个对象共用内存,修改数据会影响两者,
import numpy as np
from array import array a = array('d', [1,2,3,4])
na = np.frombuffer(a, dtype=np.float) print(a, na)
na[1] = 20
print(a, na)
array('d', [1.0, 2.0, 3.0, 4.0]) [ 1. 2. 3. 4.]
array('d', [1.0, 20.0, 3.0, 4.0]) [ 1. 20. 3. 4.]
多维数组创建以及动态添加元素演示
多维就是一维np.array创建后reshape就行了,
import math
buf = array('d')
for i in range(5):
buf.append(math.sin(i*0.1))
buf.append(math.cos(i*0.1))
data = np.frombuffer(buf, dtype=np.float).reshape(-1,2)
print(data)
[[ 0. 1. ]
[ 0.09983342 0.99500417]
[ 0.19866933 0.98006658]
[ 0.29552021 0.95533649]
[ 0.38941834 0.92106099]]
array内存分配机制以及动态数组构建的注意项
import sys a = array("d")
for i in range(10):
a.append(i)
if i == 2:
na = np.frombuffer(a, dtype=float)
print(a.buffer_info(), sys.getsizeof(a))
if i == 4:
print()
(140269607002576, 1) 96
(140269607002576, 2) 96
(140269607002576, 3) 96
(140269607002576, 4) 96
(140269607286768, 5) 128 (140269607286768, 6) 128
(140269607286768, 7) 128
(140269607286768, 8) 128
(140269607021360, 9) 192
(140269607021360, 10) 192
可以看到初始化后会初始化一段空间,当不够时会继续分配一段新的空间。
numpy数组指针初始化于i=2时,所以并未更新到最新数据,可以看到数据解析的并非我们想要的,
print(na.ctypes.data, '\n', na)
140269607002576
[ 6.93023941e-310 1.01768729e-316 0.00000000e+000]
二、利用struct结构体实现动态结构数组
利用struct结构体接收行,利用bytearray存储二进制数据,利用frombuffer读取数据,其中使用需要注意数据解析格式的设定要符合struct接收格式设定
import struct buf = bytearray()
for i in range(5):
buf += struct.pack('=hdd',i,math.sin(i*0.1),math.cos(i*0.1)) # ’=‘表示不进行数据内存占用对齐(整形和浮点型占用内存不同)
dtype = np.dtype({'names':['id','sin','cos'],'formats':['h','d','d']},align=False) # align表示是否数据已经进行了对齐
data = np.frombuffer(buf,dtype=dtype)
print(data)
print(data['id'],'\n',data['sin'],'\n',data['cos'])
[(0, 0. , 1. )
(1, 0.09983342, 0.99500417)
(2, 0.19866933, 0.98006658)
(3, 0.29552021, 0.95533649)
(4, 0.38941834, 0.92106099)]
[0 1 2 3 4]
[ 0. 0.09983342 0.19866933 0.29552021 0.38941834]
[ 1. 0.99500417 0.98006658 0.95533649 0.92106099]
此时保存出来的数组类似表格,和pd的DataFrame格式类似,行索引是0~n,列索引既可以是0~m也可以使用names的字段,见下篇。
『Numpy』内存分析_利用共享内存创建数组的更多相关文章
- 『Numpy』内存分析_高级切片和内存数据解析
在计算机中,没有任何数据类型是固定的,完全取决于如何看待这片数据的内存区域. 在numpy.ndarray.view中,提供对内存区域不同的切割方式,来完成数据类型的转换,而无须要对数据进行额外的co ...
- 『TensorFlow』分布式训练_其三_多机分布式
本节中的代码大量使用『TensorFlow』分布式训练_其一_逻辑梳理中介绍的概念,是成熟的多机分布式训练样例 一.基本概念 Cluster.Job.task概念:三者可以简单的看成是层次关系,tas ...
- 『Re』正则表达式模块_常用方法记录
『Re』知识工程作业_主体识别 一个比较完备的正则表达式介绍 几个基础函数 re.compile(pattern, flags=0) 将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的m ...
- Windows中利用共享内存来实现不同进程间的通信
Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ...
- 『TensorFlow』分布式训练_其二_单机多GPU并行&GPU模式设定
建议比对『MXNet』第七弹_多GPU并行程序设计 一.tensorflow GPU设置 GPU指定占用 gpu_options = tf.GPUOptions(per_process_gpu_mem ...
- 『Numpy』常用方法记录
numpy教程 防止输出省略号 import numpy as np np.set_printoptions(threshold=np.inf) 广播机制 numpy计算函数返回默认是一维行向量: i ...
- 『TensorFlow』读书笔记_降噪自编码器
『TensorFlow』降噪自编码器设计 之前学习过的代码,又敲了一遍,新的收获也还是有的,因为这次注释写的比较详尽,所以再次记录一下,具体的相关知识查阅之前写的文章即可(见上面链接). # Aut ...
- 『PyTorch』第九弹_前馈网络简化写法
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下 在前面的例子中,基本上都是将每一层的输出直接作为下一层的 ...
- [转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
http://blog.csdn.net/stpeace/article/details/39534361 进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法. 那么, 在本文中 ...
随机推荐
- c->log技巧
介绍: 在C代码里,有时会加入一些打印信息方便分析问题,可用如下代码替代打印函数,更加方便. // // Created by lady on 18-12-10. // #include <st ...
- 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树
正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...
- WCF中的ServiceHost初始化两种方式
1 代码方式 using(ServiceHost host=new ServiceHost(typeof(HelloWordService))) { host.AddServiceEndpoint(t ...
- 1: unit test
1: se01 进入到TR包里面,创建自己的包.(开发过程中,每个人创建一个包,最后每个包合成一个team的TR包.整个产品将所有的TR包合成,发布. 2:向cds view里面插入假数据 3:使用 ...
- 最小生成树模板题 hpu 积分赛 Vegetable and Road again
问题 H: Vegetable and Road again 时间限制: 1 Sec 内存限制: 128 MB 提交: 19 解决: 8 题目描述 修路的方案终于确定了.市政府要求任意两个公园之间都必 ...
- linq 表分组后关联查询
测试linq,获取有教师名额的学校.比如学校有5个教师名额,teacher数量没超过5个,发现有空额 var query = (from teacher in _repositoryTeacher.T ...
- CentOS 7 NAT模式LVS搭建
NAT模式下 , 调度器需要有两个IP , 一个公网IP一个内网IP , web服务器只需要内网IP 调度器LB : 192.168.94.11(内网IP) 192.168.29.11 (仅主机模式 ...
- 大堆文字不如几张图片-论信息传递的方式以NodeMCU入门为例
- 0004-20180422-自动化第五章-python基础学习笔记
内容回顾:1.数据类型 2.for和while循环 continue break #如下循环将怎么打印结果? for i in range(1,10): print(i) for i in range ...
- 关于lazyload的实现原理
核心原理是: 1 设置一个定时器,计算每张图片是否会随着滚动条的滚动,而出现在视口(也就是浏览器中的 展现网站的空白部分 )中: 2 为<img>标签设置一个暂存图片URL的自定义属性(例 ...