什么是Python列表函数的运行时复杂性?
我正在写一个看起来像这样的Python函数
def foo(some_list): for i in range(0, len(some_list)): bar(some_list[i], i)
所以它被称为
x = [0, 1, 2, 3, ... ] foo(x)
我曾经假定列表的索引访问是O(1)
,但是很惊讶的发现,对于大型列表,这比我预期的要慢得多。
那么我的问题是如何实现python列表,以下是运行时复杂性
- 索引:
list[x]
- 从最后popup:
list.pop()
- 从头开始:
list.pop(0)
- 扩展列表:
list.append(x)
额外的信用,拼接或任意popup。
有一个非常详细的表格在Python的维基回答你的问题。
然而,在你的特定的例子中,你应该使用enumerate
来获得循环内的迭代的索引。 像这样:
for i, item in enumerate(some_seq): bar(item, i)
答案是“未定义的”。 Python语言没有定义底层实现。 这里有一些你可能感兴趣的邮件列表的链接。
-
在Python的C实现中,Python的列表已经被实现为连续的向量。
-
我并不是说这些东西的O()行为应该被保密或是什么。 但是,您需要在Python如何工作的背景下解释它们。
另外,编写循环的Pythonic方法会是这样的:
def foo(some_list): for item in some_list: bar(item)
列表确实是O(1)索引 – 它们被实现为一个具有比例分配的向量,所以执行得如您所愿。 你find这个代码的速度比你预期的要慢的原因是调用了“ range(0, len(some_list))
”。
range()
会创build一个新的指定大小的列表,所以如果some_list有1,000,000个项目,你会在前面创build一个新的百万个项目列表。 这种行为在python3(范围是一个迭代器),python2等价物是xrange ,甚至更好的情况下更改为你的情况, 枚举
还不能评论,所以
如果你需要索引和值,然后使用枚举:
for idx, item in enumerate(range(10, 100, 10)): print idx, item
Python列表实际上只是数组。 从而,
索引需要O(1)
对于stream行和再次追加它应该是O(1)根据文档
查看下面的链接了解详细信息:
http://dustycodes.wordpress.com/2012/03/31/pythons-data-structures-complexity-analysis/