Python操作的复杂性备忘单
先决条件:列表、字典、集合
Python内置的数据结构(如列表、集合、字典)提供了大量操作,使编写简洁代码变得更容易,但不了解它们的复杂性可能会导致Python代码出现意外的缓慢行为。
例如:
一个简单的字典查找操作可以通过以下任一方式完成:
if key in d:
或者
if dict.get(key)
第一个对于 Python2 的时间复杂度为 O(N),对于 Python3 的时间复杂度为 O(1),而后者的时间复杂度为 O(1),这会在嵌套语句中产生很多差异。
要点:
- 列表类似于具有双向添加和删除功能的数组。
- 字典和集合使用哈希表进行插入/删除和查找操作。
可以参考此备忘单来选择相对于时间有效的操作。
列表操作
Operation | Examples | Complexity class | |
---|---|---|---|
Average case | Amortised Worst case | ||
Append | l.append(item) | O(1) | O(1) |
Clear | l.clear() | O(1) | O(1) |
Containment | item in/not in l | O(N) | O(N) |
Copy | l.copy() | O(N) | O(N) |
Delete | del l[i] | O(N) | O(N) |
Extend | l.extend(…) | O(N) | O(N) |
Equality | l1==l2, l1!=l2 | O(N) | O(N) |
Index | l[i] | O(1) | O(1) |
Iteration | for item in l: | O(N) | O(N) |
Length | len(l) | O(1) | O(1) |
Multiply | k*l | O(k*N) | O(k*N) |
Min, Max | min(l), max(l) | O(N) | O(N) |
Pop from end | l.pop(-1) | O(1) | O(1) |
Pop intermediate | l.pop(item) | O(N) | O(N) |
Remove | l.remove(…) | O(N) | O(N) |
Reverse | l.reverse() | O(N) | O(N) |
Slice | l[x:y] | O(y-x) | O(y-x) |
Sort | l.sort() | O(N*log(N)) | O(N*log(N)) |
Store | l[i]=item | O(1) | O(1) |
有关更多信息,请参阅Python中列表的内部工作。
注意:元组具有相同的操作(不可变)和复杂性。
字典操作
Operation | Examples | Complexity class | |
---|---|---|---|
Average case | Amortised Worst case | ||
Clear | d.clear() | O(1) | O(1) |
Construction | dict(…) | O(len(d)) | O(len(d)) |
Delete | del d[k] | O(1) | O(N) |
Get | d.get() | O(1) | O(N) |
Iteration(key, value, item) | for item in d: | O(N) | O(N) |
Length | len(d) | O(1) | O(1) |
Pop | d.pop(item) | O(1) | O(N) |
Pop Item | d.popitem() | O(1) | O(1) |
Returning Views | d.keys() | O(1) | O(1) |
Fromkeys | d.fromkeys(seq) | O(len(seq)) | O(len(seq)) |
注意: Defaultdict 具有与 dict 相同的操作,具有相同的时间复杂度,因为它继承自 dict。
设置操作
Operation Examples Complexity class Average case Amortised Worst case Add s.add(item) O(1) O(N) Clear s.clear() O(1) O(1) Copy s.copy() O(N) O(N) Containment item in/not in s O(1) O(N) Creation set(…) O(len(s)) O(len(s)) Discard s.discard(item) O(1) O(N) Difference s1-s2 O(len(s1)) O(len(s1)) Difference Update s1.difference_update(s2) O(len(s2)) – Equality s1==s2, s1!=s2 O(min(len(s1), len(s2))) O(min(len(s1), len(s2))) Intersection s1 & s2 O(min(len(s1), len(s2))) O(min(len(s1), len(s2))) Iteration for item in s: O(N) O(N) Is Subset s1<=s2 O(len(s1)) O(len(s1)) Is Superset s1>=s2 O(len(s2)) O(len(s1)) Pop s.pop() O(1) O(N) Union s1|s2 O(len(s1)+len(s2)) – Symmetric Difference s1^s2 len(s1) O(len(s1)*len(s2))
有关更多信息,请参阅Python中 Set 的内部工作
注意:冻结集具有相同的操作(不可变)和复杂性。