簡體   English   中英

Python 中 list.index(x) 的復雜性

[英]Complexity of list.index(x) in Python

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

就大 O 表示法而言, list.index(x)函數的運行時間是list.index(x)

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

本頁記錄了當前 CPython 中各種操作的時間復雜度(又名“Big O”或“Big Oh”)。 其他 Python 實現(或較舊或仍在開發中的 CPython 版本)可能具有略有不同的性能特征。 但是,通常可以安全地假設它們的速度不會超過 O(log n) 的倍數……

根據上述文件:

 list.index(x)

返回列表中第一個值為 x 的項目的索引。 如果沒有這樣的項目,這是一個錯誤。

這意味着搜索。 您實際上是x in s執行x in s但不是返回TrueFalse您返回的是x的索引。 因此,我會使用列出的 O(n)時間復雜度

對於線性搜索(例如,list.index),任何列表實現都將具有 O(n) 復雜度。 雖然可能有一些古怪的實現更糟糕......

您可以通過使用不同的數據結構(例如有序列表或集合)來提高查找復雜性。 這些通常用二叉樹實現。 但是,這些數據結構對其包含的元素施加了限制。 在二叉樹的情況下,元素需要是可排序的,但查找成本下降到 O(log n)。

如前所述,請在此處查看標准 Python 數據結構的運行時間成本: http : //wiki.python.org/moin/TimeComplexity

使用以下代碼檢查時序。 它的復雜度是 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)")

上面提供的文檔沒有涵蓋 list.index()

根據我的理解,list.index 是 O(1) 操作。 如果你想了解更多,這里有一個鏈接。 https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

試試這個代碼,它會幫助你得到 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM