Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于Python列表可以保存不同类型的元素,访问元素是否比常量时间更糟糕? C++等语言要求数组保持单个类型的元素。据我所知,知道每个元素的大小就可以进行指针运算,从而可以一次性访问特定元素_Python_Arrays_List_Indexing_Time Complexity - Fatal编程技术网

由于Python列表可以保存不同类型的元素,访问元素是否比常量时间更糟糕? C++等语言要求数组保持单个类型的元素。据我所知,知道每个元素的大小就可以进行指针运算,从而可以一次性访问特定元素

由于Python列表可以保存不同类型的元素,访问元素是否比常量时间更糟糕? C++等语言要求数组保持单个类型的元素。据我所知,知道每个元素的大小就可以进行指针运算,从而可以一次性访问特定元素,python,arrays,list,indexing,time-complexity,Python,Arrays,List,Indexing,Time Complexity,那怎么办 Python列表允许混合元素类型。当然,该实现不涉及访问速度慢的数据结构,比如链表——对吗?访问元素的时间是否恒定?如果是这样,Python是如何通过变量元素类型实现的?这是一个简单的索引查找。Python在其列表中存储对对象的引用,而不是对象本身。考虑一个空列表*的C++列表。每个指针都是已知大小的,数组查找速度很快,但它指向的对象的大小可能会有所不同。这是一个简单的索引查找。Python在其列表中存储对对象的引用,而不是对象本身。考虑一个空列表*的C++列表。每个指针都是已知大小的

那怎么办


Python列表允许混合元素类型。当然,该实现不涉及访问速度慢的数据结构,比如链表——对吗?访问元素的时间是否恒定?如果是这样,Python是如何通过变量元素类型实现的?

这是一个简单的索引查找。Python在其列表中存储对对象的引用,而不是对象本身。考虑一个空列表*的C++列表。每个指针都是已知大小的,数组查找速度很快,但它指向的对象的大小可能会有所不同。

这是一个简单的索引查找。Python在其列表中存储对对象的引用,而不是对象本身。考虑一个空列表*的C++列表。每个指针都是已知大小的,数组查找速度很快,但它指向的对象的大小可能会有所不同。

在Python中,所有对象都是一个对象,您可以通过类似于1的方式直观地确认它。因此,粗略地说,Python的列表只包含对存储在内存中某处的实际对象的引用。如果你通过列表索引查找一个对象-这是非常非常简单的-它会将你重定向到实际的对象


是一个很好的表,它向您展示了列表上不同操作的复杂性。

在Python中,一切都是一个对象,您可以通过类似1的方式直观地确认这一点。因此,粗略地说,Python的列表只包含对存储在内存中某处的实际对象的引用。如果你通过列表索引查找一个对象-这是非常非常简单的-它会将你重定向到实际的对象


是一个很好的表,它向您展示了列表上不同操作的复杂性。

列表包含C/C++术语中指向任何类型对象的引用指针。虽然外部存储比内部存储有明显的优势,但最好了解一些细微的缺点:总体存储空间更多,引用位置更差,更复杂的内存管理数据与列表节点分开分配和解除分配。列表包含C/C++术语中指向任何类型对象的引用指针。虽然外部存储明显优于内部存储,最好知道一些小缺点:总体存储量更多,引用的局部性更差,更复杂的内存管理数据与列表节点分开分配和释放。酷。当你说这是非常非常简单的时候,你的意思是@tdelaney在他们的回答中所说的吗?通过将索引乘以指针的大小,然后添加到列表的基址,可以找到对对象的引用吗?然后取消引用以返回对象?还是还有更多?@sgarza62:tdelaney写的是针对CPython的;每个实现都有不同的对象表示方式,四个主要实现中有两个是用甚至没有指针的语言编写的,但是,它们都以某种方式存储了一系列引用,这种存储方式对于它们所用的语言来说既紧凑又合理。我不久前读过一次,我不得不承认,我忘记了那些血淋淋的细节。但是,没错,标准的Python只存储指向列表中对象的指针。因此,列表的大小不是由实际对象的大小决定的,而是由它包含的指针的数量决定的。当你说这是非常非常简单的时候,你的意思是@tdelaney在他们的回答中所说的吗?通过将索引乘以指针的大小,然后添加到列表的基址,可以找到对对象的引用吗?然后取消引用以返回对象?还是还有更多?@sgarza62:tdelaney写的是针对CPython的;每个实现都有不同的对象表示方式,四个主要实现中有两个是用甚至没有指针的语言编写的,但是,它们都以某种方式存储了一系列引用,这种存储方式对于它们所用的语言来说既紧凑又合理。我不久前读过一次,我不得不承认,我忘记了那些血淋淋的细节。但是,没错,标准的Python只存储指向列表中对象的指针。因此,列表的大小不是由实际对象的大小决定的,而是由它包含的指针的数量决定的。如果您对CPython实现的详细功能感兴趣,那么列表实现将作为公共C API的一部分进行完整的文档记录。看见但基本上,这是您所期望的:有一个PyListObject结构,它保存一个指向PyObject*指针数组的指针。如果这听起来像是大量的去引用
呃,记住a[i]实际上是在调用a.。_getitem__[i],它必须在a的dict中查找名称_getitem_uuu,它的类型或超类,等等;这并不是缓慢的部分。如果您对CPython实现的具体功能的更多细节感兴趣,那么列表实现将作为公共C API的一部分进行完整的文档记录。看见但基本上,这是您所期望的:有一个PyListObject结构,它保存一个指向PyObject*指针数组的指针。如果这听起来像是大量的去引用……那么,请记住,a[i]实际上是在调用a.。_getitem__[i],它必须在a的dict中查找名称_getitem,它的类型或超类,等等;这并不是缓慢的部分。