与列表相比,Python Numpy如何节省内存?

在研究Numpy时,我遇到了以下代码:


import numpy as np


import time

import sys

S= range(1000)

print(sys.getsizeof(5)*len(S))


D= np.arange(1000)

print(D.size*D.itemsize)

输出为:


O/P -  14000


4000

因此,Numpy节省了内存存储空间。但是我想知道Numpy是如何做到的?


资料来源:https : //www.edureka.co/blog/python-numpy-tutorial/


炎炎设计
浏览 436回答 3
3回答

噜噜哒

NumPy的数组比Python列表更紧凑-您在Python中描述的列表列表至少需要20 MB左右,而单元格中具有单精度浮点数的NumPy 3D数组则需要4 MB。使用NumPy可以更快地访问读写项目。也许您只关心一百万个单元格就不会那么在意,但是您肯定会关心十亿个单元格-这两种方法都不适合32位体系结构,但是如果使用64位版本,NumPy可以节省大约4 GB的内存,仅Python一项就至少需要12 GB(很多指针的大小加倍),这是一个昂贵得多的硬件!差异主要是由于“间接性”造成的-Python列表是指向Python对象的指针的数组,每个指针至少4个字节,对于最小的Python对象也至少包含16个字节(类型指针为4,引用计数为4,类型为4值-内存分配器舍入为16)。NumPy数组是统一值的数组-单精度数字每个占用4个字节,双精度数字每个占用8个字节。灵活性较差,但是您要为标准Python列表的灵活性付出高昂的代价!

守着星空守着你

在您的示例中,D.size == len(S)的差异是由于D.itemsize(8)和sys.getsizeof(5)(28)之间的差异。D.dtype向您显示NumPy用作int64数据类型,每项使用(毫无疑问)64位== 8字节。实际上,这仅仅是原始数值数据,类似于C中的数据类型(实际上,它实际上就是这样)。相比之下,Python使用aint来存储项目,(如FlyingTeller所链接的问题所指出的那样)不仅仅是原始的数值数据。

繁星淼淼

Andarray将其数据存储在连续的数据缓冲区中例如,在我当前的ipython会话中:In [63]: x.shapeOut[63]: (35, 7)In [64]: x.dtypeOut[64]: dtype('int64')In [65]: x.sizeOut[65]: 245In [66]: x.itemsizeOut[66]: 8In [67]: x.nbytesOut[67]: 1960被引用的数组x具有一个内存块,其信息类似于shape和strides,并且此数据缓冲区占用1960字节。识别列表的内存使用情况例如xl = x.tolist()比较棘手。 len(xl)是35,也就是说,它的数据缓冲区有35个指针。但是每个指针都引用7个元素的不同列表。这些列表中的每一个都有指向数字的指针。在我的示例中,数字都是小于255的整数,因此每个数字都是唯一的(重复指向同一对象)。对于较大的整数和浮点数,每个整数都有一个单独的Python对象。因此,列表的内存占用量取决于嵌套的程度以及各个元素的类型。ndarray也可以具有objectdtype,在这种情况下,它也包含指向内存中其他位置的对象的指针。还有另一个细微差别-列表的主指针缓冲区的大小略大,以使其append更快。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python