Python 豆知識 — 你知道 len() 的時間複雜度是 O(1) 嗎?
覺得我們的內容實用嗎? MyApollo 電子報讀者募集中!歡迎訂閱電子報!
上過程式設計課的人都會知道,如果想知道陣列長度,會需要走訪一遍陣列,計算共有幾個元素,這個做法就引起我一個疑問:
「Python 的 len()
函式是不是也走訪 list, string, dict 等才能得到長度?如果一直對同一個 object 呼叫 len()
函式不就浪費很多時間在走訪?」
後來查了才知道,原來 len()
函式的時間複雜度是 O(1), 也就是說不管你對同一個 object 呼叫幾次 len()
函式,它都不是透過走訪的方式告訴你長度,而是立即回答你長度多少。
它的魔法也很簡單,就是 string, dist, list 等物件都有 1 個 dunder method __len__
, len()
其實是呼叫 __len__()
取得長度,換句話說,當你對 string, dist, list 等物件進行操作時,它們都有額外紀錄現在長度,例如:
>>> 'abc'.__len__()
3
如果你有客製化的 class 需要紀錄長度的話,不妨也實作 __len__
dunder method 吧,如此就能用 len()
函式取得長度囉:
>>> class A(object):
... def __len__(self):
... print('called __len__()')
... return 0
...
>>> len(A())
called __len__()
0
以上!