【问题标题】:How does Python Numpy save memory compared to a list?与列表相比,Python Numpy 如何节省内存?
【发布时间】:2018-07-09 07:25:15
【问题描述】:

我在学习 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/

编辑:This question 只回答了我的一半问题。没有提及 Numpy 模块的功能。

【问题讨论】:

标签: python python-3.x numpy


【解决方案1】:

NumPy 的数组比 Python 列表更紧凑——您描述的列表列表在 Python 中至少需要 20 MB 左右,而单元格中具有单精度浮点数的 NumPy 3D 数组将适合 4兆。使用 NumPy 也可以更快地读取和写入项目。

也许你对一百万个单元不太在意,但你肯定会关心十亿个单元——这两种方法都不适合 32 位架构,但在 64 位构建中,NumPy 4 GB 左右,仅 Python 就需要至少约 12 GB(大量指针大小翻倍)——这是一个更昂贵的硬件!

差异主要是由于“间接性”——Python 列表是指向 Python 对象的指针数组,每个指针至少 4 个字节加上即使是最小的 Python 对象也有 16 个字节(4 个用于类型指针,4 个用于引用count, 4 代表值——内存分配器四舍五入到 16)。 NumPy 数组是一个统一值数组——单精度数字每个占用 4 个字节,双精度数字占用 8 个字节。不太灵活,但您为标准 Python 列表的灵活性付出了巨大的代价!

【讨论】:

    【解决方案2】:

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

    D.dtype 向您展示 NumPy 使用 int64 作为数据类型,它使用(不出所料)64 位 == 每个项目 8 个字节。这实际上只是原始的数字数据,类似于 C 中的数据类型(在后台几乎就是这样)。

    相比之下,Python 使用 int 来存储项目,(正如 FlyingTeller 所指出的 the question 所链接的)不仅仅是原始数字数据。

    【讨论】:

      【解决方案3】:

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

      以我当前的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 引用的数组有一块内存,其中包含shapestrides 之类的信息,而这个数据缓冲区占用了 1960 字节。

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

      ndarray 也可以有object dtype,在这种情况下,它也包含指向内存中其他地方的对象的指针。

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

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 2015-09-19
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        相关资源
        最近更新 更多