- 主题:Python 的标准模块 array 是不是内存连续的
用 id 试了几个类型码的 array
发现从元素的 id 差上看不出来连续
有网文说 array 的 C 实现基于数组
但 Python 语法上并没有直接证据表明内存连续
这既让我怀疑 id 的内存地址解释
也让我怀疑标准的 array 不是内存连续的
--
修改:easior FROM 117.143.144.*
FROM 117.143.144.*
多谢帮我确认array的实现
通过搜索我搞清了 id 的"地址":
ctypes. cast(id(X), ctypes.py_object).value
也即某种地址对应关系
最后,我有点不解 python 版的数据结构书为什么要谈内存布局,感觉不着边际
【 在 CKevin 的大作中提到: 】
:att
--
FROM 117.143.144.*
多谢指点
知道该关注的部分了
【 在 milksea 的大作中提到: 】
:数组的内存布局决定基本的时空效率,还是有必要澄清的。
--
FROM 120.253.228.*
你说的当然对
主要是 id 的地址解释与C地址对不上
现在我搞明白了
【 在 cum 的大作中提到: 】
:new出来的内存是否连续难道不是基于os的内存分配策略?:虚拟内存地址当然是连续的,物理内存就不一定了。
--
FROM 120.253.228.*
确实是选择讲解的要点所在
【 在 gaofei 的大作中提到: 】
: 因为重点是要将数据结构吧
--
FROM 117.143.144.*
你的猜测完全正确
至于 i_getitem 的实现,感觉好复杂啊
【 在 CKevin 的大作中提到: 】
: 关于id的话,这里面还有一个事儿,cpython实现中的id取的是对象的地址,而不是C意义上的数组元素的地址。
: 我猜你会不会是这么试的:
: a = array.array('i')
: ...................
--
FROM 117.143.144.*
哈哈,不是我忽悠要讲,是我被拉去要讲,不明就里
【 在 echiz 的大作中提到: 】
: 简单讲数据结构就是讲内存的,跟你忽悠python的数据结构,不扯内存扯啥呢?
--
FROM 117.143.144.*
其实就是对“数组”这个术语的解释问题
看到 array,感觉内存布局也是应该连续的
然后套用 C 的方式去理解
可 Python 里的下标并不直接跟 C 对应
【 在 Madlee 的大作中提到: 】
: array存的只是PyObject*吧,指针数组连续不代表存的指针是连续的吧。
--
FROM 117.143.144.*
【 在 poggy 的大作中提到: 】
: 多维数组的连续, 一直就有C布局和F(Fortran)布局的区分,
: 也就是二维数组线性化为一维线性空间如果展开的问题, C是横展开, 而F(fortran)选择的是列展开。
原先看到“行优先”和“列优先”,不知道和编程语言有什么关联
: 如果数组比较大, 尤其大到CPU的cache不命中, 不同布局对性能是有一定的影响的。
怪不得性能优化的时候要考虑优先问题
--
FROM 117.143.144.*
这个我懂,我只讲数据结构的大道理(咳……)
用 Python 的代码,我只说那是模拟不是验证
至于 Python 的 C 实现,那是肯定不敢讲的
【 在 gfkid 的大作中提到: 】
: Python的list等都是包了一层又一层的了
: Python代码适合描述算法,但是Python代码不适合验证算法
: 如果你非要讲清楚Python的数据结构,你就会背离你上课的主要目标
: ...................
--
FROM 117.143.144.*