Python中list.index(x)的复杂性

时间:2011-05-06 15:34:46

标签: python algorithm list big-o performance

我指的是:http://docs.python.org/tutorial/datastructures.html

{O}符号表示list.index(x)函数的运行时间是多少?

6 个答案:

答案 0 :(得分:32)

这是O(n),也请查看:http://wiki.python.org/moin/TimeComplexity

  

此页面记录了当前CPython中各种操作的时间复杂度(又名“Big O”或“Big Oh”)。其他Python实现(或CPython的旧版本或仍在开发版本)可能具有略微不同的性能特征。但是,通常可以安全地假设它们的速度不超过O(log n)...

答案 1 :(得分:8)

根据上述文件:

list.index(x)
     

返回值为x的第一个项目列表中的索引。   如果没有这样的项目,则会出错。

这意味着搜索。您实际上正在x in s,但不是返回TrueFalse,而是返回x的索引。因此,我会选择O {n}的listed time complexity

答案 2 :(得分:1)

任何列表实现对于线性搜索(例如,list.index)将具有O(n)复杂度。虽然可能有一些古怪的实现,但更糟糕的是......

您可以使用不同的数据结构(例如有序列表或集合)来提高查找复杂性。这些通常用二叉树实现。但是,这些数据结构对它们包含的元素施加了约束。对于二叉树,元素需要可订购,但查找成本会降低到O(log n)。

如前所述,请查看标准Python数据结构的运行时成本: http://wiki.python.org/moin/TimeComplexity

答案 3 :(得分:0)

使用以下代码检查时间。它的复杂度为O(n)。

import time


class TimeChecker:

    def __init__(self, name):
        self.name = name

    def __enter__(self):
        self.start = self.get_time_in_sec()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        now = self.get_time_in_sec()
        time_taken = now - self.start  # in seconds
        print("Time Taken by " + self.name + ": " + str(time_taken))

    def get_time_in_sec(self):
        return int(round(time.time() * 1000))


def test_list_index_func(range_num):
    lis = [1,2,3,4,5]
    with TimeChecker('Process 1') as tim:
        for i in range(range_num):
            lis.index(4)

test_list_index_func(1000)
test_list_index_func(10000)
test_list_index_func(100000)
test_list_index_func(1000000)

print("Time: O(n)")

答案 4 :(得分:-1)

上面提供的文档没有涵盖list.index()

据我了解,list.index是O(1)运算。 如果您想了解更多,这里是一个链接。 https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

答案 5 :(得分:-3)

尝试使用此代码,它将帮助您获得lis.index运算符执行的时间。

import timeit
lis=[11,22,33,44,55,66,77] 
for i in lis: 
    t = timeit.Timer("lis.index(11)", "from main import lis") 
    TimeTaken= t.timeit(number=100000) 
    print (TimeTaken)