Python 松散类型语言如何为数组提供恒定的查找时间?

Python 松散类型语言如何为数组提供恒定的查找时间?,python,c,arrays,Python,C,Arrays,如果我有一个C中长度为10的整数数组“arr”,要查找arr[5],程序只需将20添加到当前指针位置并检索我的值(常数时间) 但是如果数组是松散类型的(python/javascript列表),指针如何在固定时间内知道元素的位置?因为它不再假设每个元素都是固定字节。您可以查看Python的源代码-: 您是对的,因为我们不能依赖数据偏移量进行常量查找。通常,不同的数据结构(如哈希表或树)会被实现,以便保留摊销常量时间。如果您有“通用对象”类型,则可以是字节数组或等效类型。数组中的固定位置可以是关于

如果我有一个C中长度为10的整数数组“arr”,要查找arr[5],程序只需将20添加到当前指针位置并检索我的值(常数时间)


但是如果数组是松散类型的(python/javascript列表),指针如何在固定时间内知道元素的位置?因为它不再假设每个元素都是固定字节。

您可以查看Python的源代码-:


您是对的,因为我们不能依赖数据偏移量进行常量查找。通常,不同的数据结构(如哈希表或树)会被实现,以便保留摊销常量时间。如果您有“通用对象”类型,则可以是字节数组或等效类型。数组中的固定位置可以是关于大小、成员等的信息,而数组是一个对象,因此它会告诉您它包含什么类型的内容以及它们的大小,并有一个指向“真实”数组在内存中起始位置的指针。基本上将数组看作嵌套在常规对象中的C数组。或者类似的,这只是一个粗略的想法。它可以保留一个指针的内部列表,大小不变。支持Python列表的实际底层数组是一个大小不变的PyObject指针数组。谢谢!这对理解非常有帮助。谢谢你,这非常有帮助
typedef struct {
    PyObject_VAR_HEAD
    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item == NULL implies ob_size == allocated == 0
     * list.sort() temporarily sets allocated to -1 to detect mutations.
     *
     * Items must normally not be NULL, except during construction when
     * the list is not yet visible outside the function that builds it.
     */
    Py_ssize_t allocated;
} PyListObject;
static PyObject *
list_item(PyListObject *a, Py_ssize_t i)
{
    ...
    Py_INCREF(a->ob_item[i]);
    return a->ob_item[i];
}