我在写这看起来是这样的一个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)
对于额外的信用,剪接或任意持久性有机污染物。
有Python的维基一个非常详细的表格 ,回答你的问题。
然而,在你的具体的例子,你应该使用enumerate
的循环中得到一个迭代的索引。 像这样:
for i, item in enumerate(some_seq):
bar(item, i)
答案是“不确定”。 Python语言没有定义的底层实现。 这里有一些链接,你可能会感兴趣的邮件列表线程。
此外,在编写循环的更Python的方法是这样的:
def foo(some_list):
for item in some_list:
bar(item)
列表确实是O(1)指数 - 他们与比例过度分配的载体来实现,所以执行正如你所期望太多。 你发现这个代码速度低于预期可能的原因是调用“ range(0, len(some_list))
”。
range()
创建指定大小的新名单,因此,如果some_list共有1,000,000项,您将创建一个新的百万项目列表前面。 这python3行为的变化(范围是一个迭代器),以该python2相当于是x范围 ,甚至对你的情况比较好, 枚举
无法发表评论还,所以
如果你需要索引和值,那么使用枚举:
for idx, item in enumerate(range(10, 100, 10)):
print idx, item
Python列表其实也没什么,但阵列。 从而,
索引花费O(1)
对于流行并再次追加它应该是O(1),按照该文档
看看下面的链接了解详细信息:
http://dustycodes.wordpress.com/2012/03/31/pythons-data-structures-complexity-analysis/