- 主题:Python 的标准模块 array 是不是内存连续的
只是用py语言讲,因为py简单
但是数据结构不讲内存的话,那还和没讲一样吗
如果说py就不讲内存,那数据结构也不用讲了,所有东西都有现成实现好了的
【 在 kawolu 的大作中提到: 】
: py讲内存布局有点扯。
: 不过涉及高性能计算的话,内存布局是个非常重要的点,一大批性能优化都是围绕内存布局搞的。
:
--
FROM 123.184.132.*
确实是选择讲解的要点所在
【 在 gaofei 的大作中提到: 】
: 因为重点是要将数据结构吧
--
FROM 117.143.144.*
那么mojo呢?
【 在 kawolu 的大作中提到: 】
: py讲内存布局有点扯。
: 不过涉及高性能计算的话,内存布局是个非常重要的点,一大批性能优化都是围绕内存布局搞的。
--
FROM 111.162.221.*
哦,讲课可能需要
但是用Python写代码我觉得没必要了解
【 在 gaofei 的大作中提到: 】
: 只是用py语言讲,因为py简单
: 但是数据结构不讲内存的话,那还和没讲一样吗
: 如果说py就不讲内存,那数据结构也不用讲了,所有东西都有现成实现好了的
: ...................
--
FROM 114.249.22.*
【 在 kawolu 的大作中提到: 】
: 虚拟内存映射是按页的,所以一般来讲,一页之内的都是连续的。
:
re
--
FROM 223.160.128.*
关于id的话,这里面还有一个事儿,cpython实现中的id取的是对象的地址,而不是C意义上的数组元素的地址。
我猜你会不会是这么试的:
a = array.array('i')
a.append(...) #......
id(a[0])
id(a[1])
这个代码有个问题是python中的a[0]和c/c++中的a[0]的含义是不一样的。对于array,其中一个实现是:
static PyObject *
i_getitem(arrayobject *ap, Py_ssize_t i)
{
return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
}
也就是说当你取a[i]时,python很有可能为此操作新建了对象,此时id取的是新临时对象的地址而不是c语言意义上的数组基地址加偏移。
比如说
>>> a
array('i', [1239178023, 18234958, 901283917])
>>> id(a[0])
4343456464
>>> id(a[1])
4343458864
>>> id(a[2])
4343458672
>>> id(a.__getitem__(0))
4343456464
>>> b = a[0]
>>> id(b)
4343458864
>>> b = a[1]
>>> id(b)
4343456464
【 在 easior 的大作中提到: 】
: 多谢帮我确认array的实现
: 通过搜索我搞清了 id 的"地址":
: ctypes. cast(id(X), ctypes.py_object).value
: ...................
--
FROM 221.216.116.*
简单讲数据结构就是讲内存的,跟你忽悠python的数据结构,不扯内存扯啥呢?
【 在 easior 的大作中提到: 】
: 多谢帮我确认array的实现
: 通过搜索我搞清了 id 的"地址":
: ctypes. cast(id(X), ctypes.py_object).value
: ...................
--
FROM 110.229.110.*
你的猜测完全正确
至于 i_getitem 的实现,感觉好复杂啊
【 在 CKevin 的大作中提到: 】
: 关于id的话,这里面还有一个事儿,cpython实现中的id取的是对象的地址,而不是C意义上的数组元素的地址。
: 我猜你会不会是这么试的:
: a = array.array('i')
: ...................
--
FROM 117.143.144.*
哈哈,不是我忽悠要讲,是我被拉去要讲,不明就里
【 在 echiz 的大作中提到: 】
: 简单讲数据结构就是讲内存的,跟你忽悠python的数据结构,不扯内存扯啥呢?
--
FROM 117.143.144.*
不是说你忽悠,是开这课的人。
当年学数据结构就一脑袋问号,等想明白数据结构讲的是什么的时候,我就纳闷了,为啥数据结构的课要在微机原理和操作系统之前开?
现在更离谱,拿java和c#讲数据结构不说,还要拿python讲.......
【 在 easior 的大作中提到: 】
: 哈哈,不是我忽悠要讲,是我被拉去要讲,不明就里
--
FROM 110.229.110.*