【发布时间】:2015-11-29 04:56:36
【问题描述】:
我现在正在学习 Python,并试图了解容器在实践中的工作原理。 有一个问题我无法解释。 假设,我创建了一个非常大的列表:
>>> l = [i for i in range(100000000)] # ~3 sec
创建它需要大约 3 秒(我使用升序而不是相同的值来避免可能的优化)
我们可以看到here,删除运营成本O(n)。但是当我从列表中间删除一个元素时,它会立即返回(与任何其他简单命令一样快,如元素访问)
>>> del l[50000000] # instantly (< 0.1 sec)
在此之后,我可以在删除后不到 3 秒内访问元素 l[25000000] 和 l[75000000],并且它也会立即执行(因此,我无法通过延迟或后台删除来解释这一点)。
有人可以解释一下,它是如何在内部完成的吗?该列表实际上是作为某种树实现的吗?这听起来很奇怪,而且它违反了constant time element access 的要求。
这是一种常见的优化,如 C++ 中的返回值优化,还是很少见的,仅特定于我的平台/版本?
我使用 Linux 和 Python 3.4.1(Python 2.7.9 显示相同的结果)。
【问题讨论】:
-
1) 这不是“时间复杂性”的意思。 2) 展示你要进行基准测试的完整代码 3) 展示你是如何做到的。
-
“列表实际上是作为某种树实现的吗?” - 不,也没有进行一些 “背景移除” . Python是开源的,可以看实现:hg.python.org/cpython/file/tip/Objects/listobject.c
-
我使用的是 python 解释器,而不是单独的程序。我已经提供了我输入的所有代码。在时间复杂度下,我指的是操作的渐近复杂度,而不是执行所需的时间。
-
@Vasily 是的,完全。您正在“试图了解容器的工作原理”,这是一种方法。另请注意,您需要在您的 cmets 中包含
@username以告知其他用户您正在处理他们。 -
listobject.c 源代码很容易阅读,前提是您对 C 语法有一定了解。
标签: python optimization time-complexity python-internals