Numpy数组如何在内存中存储数据?


a = [5,6,7,8]
print('for list:')
for i in a:
print((id(i)))

import numpy as np
z = np.array([9,10,11,12])
print('for numpy:')
for i in z:
print((id(i)))

注意:当我试图查看列表中值的内存地址时,它需要32位的连续内存。但是,当我将列表转换为Numpy数组并打印值的地址时,备用值将占用相同的内存地址。我不明白为什么会这样?

output:

for list:
94620302609024
94620302609056
94620302609088
94620302609120

for numpy:
139853895184240
139853895279216
139853895184240
139853895279216

可以看到,对于numpy数组,备选值的内存地址是相同的。请解释一下为什么会这样?

首先,id()不一定返回内存地址;它恰好在CPython中这样做是一个实现细节。同样重要的是要认识到,只要对象存在,id就有效。如果一个对象已被垃圾收集,则可能会创建一个具有相同id的新对象。

内置的Python列表类型不存储对象,它存储对对象的引用。这就是为什么同一个对象可以同时是几个列表的成员。(或字典,或只是普通变量)

Numpy数组(通常)根本不存储Python对象——这将非常低效,这也是我们首先使用Numpy的原因之一!这意味着,当循环遍历narray时,必须为从数组中取出的每个数字创建一个对象。所以你看到的id:s不是存储数字的id:s——那些不是对象,因此没有id:s!-而是创建的临时对象的id:s。而且,由于您没有保留这些对象,而是在每次循环迭代后将它们丢弃,因此,新对象有时会获得与旧对象相同的id也就不足为奇了。

最新更新