为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2021-04-08 14:15:24
在研究Numpy时,我遇到了以下代码:import numpy as npimport timeimport sysS= range(1000)print(sys.getsizeof(5)*len(S))D= np.arange(1000)print(D.size*D.itemsize)输出为:O/P -  140004000因此,Numpy节省了内存存储空间。但是我想知道Numpy是如何做到的?资料来源:https : //www.edureka.co/blog/python-numpy-tutorial/
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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列表的灵活性付出高昂的代价!


查看完整回答
反对 回复 2021-04-27
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

在您的示例中,D.size == len(S)的差异是由于D.itemsize(8)和sys.getsizeof(5)(28)之间的差异。

D.dtype向您显示NumPy用作int64数据类型,每项使用(毫无疑问)64位== 8字节。实际上,这仅仅是原始数值数据,类似于C中的数据类型(实际上,它实际上就是这样)。

相比之下,Python使用aint来存储项目,(如FlyingTeller所链接的问题所指出的那样)不仅仅是原始的数值数据。


查看完整回答
反对 回复 2021-04-27
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

Andarray将其数据存储在连续的数据缓冲区中


例如,在我当前的ipython会话中:


In [63]: x.shape

Out[63]: (35, 7)

In [64]: x.dtype

Out[64]: dtype('int64')

In [65]: x.size

Out[65]: 245

In [66]: x.itemsize

Out[66]: 8

In [67]: x.nbytes

Out[67]: 1960

被引用的数组x具有一个内存块,其信息类似于shape和strides,并且此数据缓冲区占用1960字节。


识别列表的内存使用情况例如xl = x.tolist()比较棘手。 len(xl)是35,也就是说,它的数据缓冲区有35个指针。但是每个指针都引用7个元素的不同列表。这些列表中的每一个都有指向数字的指针。在我的示例中,数字都是小于255的整数,因此每个数字都是唯一的(重复指向同一对象)。对于较大的整数和浮点数,每个整数都有一个单独的Python对象。因此,列表的内存占用量取决于嵌套的程度以及各个元素的类型。


ndarray也可以具有objectdtype,在这种情况下,它也包含指向内存中其他位置的对象的指针。


还有另一个细微差别-列表的主指针缓冲区的大小略大,以使其append更快。


查看完整回答
反对 回复 2021-04-27
  • 3 回答
  • 0 关注
  • 435 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信