【问题标题】:what are the sizes of integer and array in python and numpypython和numpy中整数和数组的大小是多少
【发布时间】:2019-01-18 08:48:49
【问题描述】:

我正在尝试确定python中不同数据类型的大小,并编写了以下代码。每行的输出都显示为它们旁边的 cmets。

import numpy as np
import sys
print(sys.version) # 3.6.7
print(np.version.version) # 1.15.4

i = 2
print(type(i)) # <class 'int'>
print(sys.getsizeof(i)) # 28

j = np.int64(3)
print(type(j)) # <class 'numpy.int64'>
print(sys.getsizeof(j)) # 32

a = np.array([[1,2],[3,4],[5,6]])
print(type(a)) # <class 'numpy.ndarray'>
print(sys.getsizeof(a))   # 160
print(type(a[0][0])) # <class 'numpy.int64'>
print(sys.getsizeof(a[0][0])) # 32

a = np.array([[1,2],[3,4],[5,6],[7,8]])
print(sys.getsizeof(a))   # 176

从上面的输出中,一个 6 元素数组的大小是 160,一个 8 元素数组的大小是 176,所以我可以得出结论,数组中每个元素的大小是 8 字节,并且数组头的大小(常量) 是 112 字节吗?每个元素的大小是恒定的还是取决于它的值(大还是小)?

另外,当我打印 a[0][0] 的大小时,为什么我得到 32 而不是 8? python 和 numpy 整数和数组背后的数学究竟是什么?

【问题讨论】:

  • a[0][0] 也是numpy.ndarray。为什么不期待 120?
  • Numpy 是用 cython 编码的,所以下面是 C,我认为你不能真正依赖 pyhon int 的大小(我认为它们在 C 中被翻译成 long)

标签: python python-3.x


【解决方案1】:

实际上“sys.getsizeof”不是一个合适的函数来确定numpy的大小。它只适用于内置的 python 对象。

以字节为单位返回对象的大小。对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但这对于第三方扩展不一定适用,因为它是特定于实现的。

getsizeof() 调用对象的 sizeof 方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销。

对于 numpy.ndarray 使用 nbytes 这是 size * itemsize

a = np.array([[3,4],[8,0],[9,8],[7,0]])
a.size # 8
a.itemsize # 8
a.nbytes # 64
a = np.array([[3,4],[8,0],[9,8],[7,0]],dtype=np.int32)
a.size # 8
a.itemsize # 4
a.nbytes # 32

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多