簡體   English   中英

Python中訪問列表的時間復雜度是多少?

[英]What's the time complexity of list access in Python?

我正在嘗試盡可能快地制作 python function。 假設我有一個素數列表,並且我為同一個i調用了primes[i] n 次。

我的直覺是,從 n 的某個值開始,將primes[i]的值保存在變量中變得更加容易。

我通過比較以下兩個實現進行了一些嘗試,但我無法弄清楚哪個是最快的。 看起來訪問primes[i]的時間取決於很多因素。

第一次實施

while n != 1:
            p = primes[i]
            if n % p == 0:
                n = n // p
                factorization.append(p)
            else:
                i += 1

第二次實施

while n != 1:
            if n % primes[i] == 0:
                n = n // primes[i]
                factorization.append(primes[i])
            else:
                i += 1

是否有任何規則可以從多少次調用中知道將列表元素的值保存在變量中變得有趣?

訪問primes[i]是在常數時間O(1)內完成的。 這意味着讀取primes[i]所需的時間不會隨着primes變大而增加,也不會隨着i變大而增加。 用外行的話來說:這太他媽快了!

再一次,訪問局部變量p仍然比訪問primes[i]快,因為后者必須查找並調用primes object 的__getitem__實現。因此將值緩存在局部變量中而不是查找列表兩次稍微快一點。

另一方面,與降低算法復雜度相比,關心邊際速度改進是沒有意義的。 對於尋找素數的問題,您應該專注於尋找智能算法而不是改進內置列表訪問時間。

嘗試使用基准

import time

start = time.time()
while n != 1:
        p = primes[i]
        if n % p == 0:
            n = n // p
            factorization.append(p)
        else:
            i += 1
end = time.time()
print(end - start)

對實現 2 做同樣的事情並進行比較。

而且,嘗試在 google colab 或任何其他外部機器中進行操作以獲得更好的結果。

暫無
暫無

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

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