- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个数组
arr = array([ 9.93418544e+00, 1.17237323e+01, 1.34554537e+01,
2.43598467e+01, 2.72818286e+01, 3.11868750e+01,...])
当执行以下命令时,我得到一些输出:
arr.itemsize # 8
type(arr[0]) # numpy.float64
sys.getsizeof(np.float64()) # 32
sys.getsizeof(arr[0]) # 32
arr.dtype # dtype('float64')
itemsize 似乎无法正常工作。我很感兴趣为什么会发生这种情况?
我与
一起工作print(sys.version)
3.5.5 | packaged by conda-forge | (default, Jul 24 2018, 01:52:17) [MSC v.1900 64 bit (AMD64)]
numpy==1.10.4
最佳答案
It seems that itemsize doesn't work properly.
确实如此,不同的结果是由于 Python 对象与 numpy 中的项目不同而导致的。
在Python中,一切都是对象。数据被“装箱”。这意味着,例如对于 int
,我们得到:
>>> sys.getsizeof(2)
28
即 28 个字节。那是很多。在大多数编程语言中,int
占用 2 到 8 个字节。如果是 32 位 int
,则需要 4 个字节。
但在Python中,一个对象有很多“上下文”。例如一些字节用来表示对象的类型等。
但是 Numpy 不是在 Python 中实现的,它不是一个使用 Python 对象本身的库。它更像是一个用 C 实现的库,并且具有良好的 Python 接口(interface)。因此,这意味着列表 [1, 4, 2, 5]
在 Python 中不是存储为具有四个对 int
对象的引用的列表,而是存储为数组,通常与“未装箱”的元素。因此,考虑到 int
每个 32 位、4*32 位以及数组周围“上下文”的一些额外空间,上述内容将采用。
因此,元素可以以更节省空间的方式存储。这使得处理值变得更容易,因为我们在这里不跟随指针,而是直接跟随值(有一些方法可以将引用存储在 numpy 数组中,但现在让我们忽略它)。此外,到目前为止,numpy 数组占用的内存比等效的 Python 列表(连同它所包含的项目)要少。
但是,如果您从 numpy 数组中获取一项,则需要为此创建一个 Python 对象。因此,这意味着这里它将构造一个 numpy.float64 对象,其中包含该值,但又包含该值周围的大量“上下文”。这会导致使用更多内存。
numpy 构造特定类型对象的数组这一事实也会产生一些后果。例如,如果您使用 numpy.int16
,则意味着无法将大于 32767 的值存储到其中,因为该值无法用 16 位 2-complement 表示形式表示:
>>> np.int16(32767)
32767
>>> np.int16(32768)
-32768
此外,如果不使用 Python 对象引用或其他一些“技巧”,就无法构造一个包含不同类型对象的数组。例如,Numpy 构造一个 int16
数组,这意味着它将 160 位解释为 10 个 16 位数字。在Python中,列表本身包含对对象的引用,并且Python对象知道它是什么类型,因此这意味着我们可以设置对另一种类型的另一个对象的引用。
关于python - np.array arr.itemsize 与 sys.getsizeof(arr[0]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141990/
我有以下二维位图: num = 521 arr = [i == '1' for i in bin(num)[2:].zfill(n*n)] board = [arr[n*i:n*i+n] for i
我一直在检查函数sys.getsizeof ,我知道这会返回正在传递的参数的大小(以字节为单位)。 我有一些使用 C 的经验,在知道某些类型的大小的情况下,我可以计算出某些值的大小。我已经用这个函数进
这个问题已经有答案了: "sys.getsizeof(int)" returns an unreasonably large value? (1 个回答) 已关闭 5 年前。 import sys p
我正在尝试创建一个大小为 1 MB 的列表。而以下代码有效: dummy = ['a' for i in xrange(0, 1024)] sys.getsizeof(dummy) Out[1]: 9
我在 Python 3.7 的 IDLE 中制作了两个列表,名称分别是 a 和 b它们在初始化方面会有所不同,但内容是相同的(正如我所想,但也许我错了) >>>a = [1,2,3,4] >>>a [
在使用 sys.getsizeof() 时,我注意到随着 ints 的大小增加,它会返回更高的值,这表明它们使用了更多的内存: >>> sys.getsizeof(3) 28 >>> >>> sys.
我刚刚运行了这些代码: v = [1,2,'kite',100**100] for x,y in enumerate(v): print ("{} size is: {}".format(y,
我正在尝试创建一个大小为 1 MB 的列表。而以下代码有效: dummy = ['a' for i in xrange(0, 1024)] sys.getsizeof(dummy) Out[1]: 9
这个问题在这里已经有了答案: How do I measure the memory usage of an object in python? (2 个回答) 关闭3年前。 我想计算一个对象使用的内
当我运行以下代码时,我分别得到3和36作为答案。 x ="abd" print len(x) print sys.getsizeof(x) 有人可以向我解释一下两者之间有什么区别吗? 最佳答案 在所有
我注意到当存储到 NumPy 数组时,nbytes 和 getsizeof 返回两个不同的值。 例子: import sys import numpy as np x = np.random.rand
我有一个大小为 10240 字节的文件。这是我获取文件大小的脚本: fh = open(name, "r") data = fh.read(10240) print sys.getsizeof(dat
为什么会这样?列表(有开销)不应该比字符串大吗? import sys print(sys.getsizeof('a'*1000)) # output is 1049 print(sys.getsiz
python 版本:Python 3.6.0b3(默认,2016 年 11 月 16 日,16:55:09) 我有以下输出: >>> sys.getsizeof([0 for x in range(1
我很好奇 - 为什么sys.getsizeof调用返回的列表数小于其元素之和? import sys lst = ["abcde", "fghij", "klmno", "pqrst", "uvwxy
为什么长度为1的python的sys.getsizeof()比长度为2的字符串的str大?(对于长度>2,该关系似乎如预期的单调增加)。 例子: >>> from string import asci
我很好奇 - 为什么 sys.getsizeof调用为列表返回一个小于其元素总和的数字? import sys lst = ["abcde", "fghij", "klmno", "pqrst", "
我想在python中检查int数据类型的大小: import sys sys.getsizeof(int) 结果是“436”,这对我来说没有意义。无论如何,我想知道我的机器将占用多少字节 (2,4,.
当我运行以下代码时,我分别得到 3 和 36 作为答案。 x ="abd" print len(x) print sys.getsizeof(x) 谁能给我解释一下它们之间有什么区别? 最佳答案 它们
我正在玩 python 列表,我想在不使用列表时从内存中删除它。(我有大数据列表,可能有数千或数百万个元素..数据类型-> 浮点型) 我试过这段代码,看看删除在 python 中是如何工作的(示例)
我是一名优秀的程序员,十分优秀!