【问题标题】:Reason Behind O(1) in finding the length of List in python在 python 中查找 List 长度的 O(1) 背后的原因
【发布时间】:2019-01-23 08:36:31
【问题描述】:

我正在查看 Python 中的 https://wiki.python.org/moin/TimeComplexity 列表。我知道 python list 在内部作为一个数组工作。但是列表的内部长度是O(1)。因为它需要遍历到列表末尾并递增计数器并返回它。

提前致谢

【问题讨论】:

  • 我们可以很容易地实现一个列表类,它有一个成员长度,它存储列表的实际长度,并且每当请求获得它的长度时,只需返回该成员而不是再次查找长度。跨度>
  • 它跟踪长度。它不必遍历列表来计数。

标签: python arrays python-3.x list


【解决方案1】:

TL;DR 列表会跟踪它们的长度。

在 CPython 中,调用 len([]) 会调用 Py_SIZE C 宏,它只返回 ob_size 属性的值。

https://github.com/python/cpython/blob/cda73a5af2ff064ca82140342b3158851d43868f/Objects/listobject.c#L438-L442

static Py_ssize_t
list_length(PyListObject *a)
{
    return Py_SIZE(a);
}

https://github.com/python/cpython/blob/9bdd2de84c1af55fbc006d3f892313623bd0195c/Include/object.h#L128

#define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size)

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2015-09-28
    • 2018-06-07
    相关资源
    最近更新 更多