我在出現問題時使用了這段代碼來檢索串列中每個元素的計數:
nums = [1,1,3,2,3,3,4,1,1,4,2,3,3,2,1,3,4,1,2]
print([nums.count(num) for num in set(nums)])
這段代碼運行良好,但看起來不像這段代碼那么高效:
from collections import Counter
nums = [1,1,3,2,3,3,4,1,1,4,2,3,3,2,1,3,4,1,2]
counter = Counter(nums)
print(counter.values())
有人可以向我解釋為什么collections圖書館比香草串列理解更快嗎?
uj5u.com熱心網友回復:
代碼Counter大致相當于:
def counter_v1(seq):
counts = {}
for x in seq:
counts[x] = counts.get(x, 0) 1
return counts
代碼.count大致相當于:
def count(seq, x):
c = 0
for y in seq:
if y == x:
c = 1
return c
def counter_v2(seq):
counts = {}
for x in set(seq):
counts[x] = count(seq, x)
return counts
如您所見,函式counter_v1使用單個 for 回圈遍歷序列一次。相比之下,函式對每個不同元素counter_v2迭代一次序列,在另一個 for 回圈中使用一個 for 回圈。
的運行時間counter_v1將大致與 成正比len(seq),而 的運行時間counter_v2將大致與 成正比len(seq) * len(set(seq)),通常要大得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464743.html
