python列表函数的运行时复杂性是多少?

时间:2009-06-17 07:28:55

标签: python complexity-theory

我正在写一个看起来像这样的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]
  • 从最后弹出:list.pop()
  • 从头开始弹出:list.pop(0)
  • 扩展列表:list.append(x)

额外信用,拼接或任意弹出。

5 个答案:

答案 0 :(得分:34)

a very detailed table on python wiki可以回答您的问题。

但是,在您的特定示例中,您应该使用enumerate来获取循环中可迭代的索引。像这样:

for i, item in enumerate(some_seq):
    bar(item, i)

答案 1 :(得分:7)

答案是“未定义”。 Python语言没有定义底层实现。以下是您可能感兴趣的邮件列表主题的一些链接。

此外,更多Pythonic编写循环的方式是:

def foo(some_list):
   for item in some_list:
       bar(item)

答案 2 :(得分:6)

列表确实是O(1)索引 - 它们被实现为具有比例分配的向量,因此执行的操作与您期望的一样。您发现此代码比预期慢的可能原因是调用“range(0, len(some_list))”。

range()创建一个指定大小的新列表,因此如果some_list有1,000,000个项目,您将预先创建一个新的百万项目列表。这种行为在python3中变化(范围是一个迭代器),python2等效于xrange,甚至更适合你的情况,enumerate

答案 3 :(得分:3)

无法发表评论,所以

如果您需要索引和值,请使用enumerate:

for idx, item in enumerate(range(10, 100, 10)):
    print idx, item

答案 4 :(得分:1)

Python列表实际上只是数组。因此,

索引需要O(1)

对于pop和

再次附加它应该是O(1)根据文档

查看以下链接了解详情:

http://dustycodes.wordpress.com/2012/03/31/pythons-data-structures-complexity-analysis/