📜  Python操作的复杂性备忘单

📅  最后修改于: 2022-05-13 01:54:42.529000             🧑  作者: Mango

Python操作的复杂性备忘单

先决条件:列表、字典、集合

Python内置的数据结构(如列表、集合、字典)提供了大量操作,使编写简洁代码变得更容易,但不了解它们的复杂性可能会导致Python代码出现意外的缓慢行为。

例如:

一个简单的字典查找操作可以通过以下任一方式完成:

if key in d:

或者

if dict.get(key)

第一个对于 Python2 的时间复杂度为 O(N),对于 Python3 的时间复杂度为 O(1),而后者的时间复杂度为 O(1),这会在嵌套语句中产生很多差异。

要点:

  1. 列表类似于具有双向添加和删除功能的数组。
  2. 字典和集合使用哈希表进行插入/删除和查找操作。

可以参考此备忘单来选择相对于时间有效的操作。

列表操作

OperationExamplesComplexity class
 Average caseAmortised Worst case
Appendl.append(item)O(1)O(1)
Clearl.clear()O(1)O(1)
Containmentitem in/not in lO(N)O(N)
Copyl.copy()O(N)O(N)
Deletedel l[i]O(N)O(N)
Extendl.extend(…)O(N)O(N)
Equalityl1==l2, l1!=l2O(N)O(N)
Indexl[i]O(1)O(1)
Iterationfor item in l:O(N)O(N)
Lengthlen(l)O(1)O(1)
Multiplyk*lO(k*N)O(k*N)
Min, Maxmin(l), max(l)O(N)O(N)
Pop from endl.pop(-1)O(1)O(1)
Pop intermediatel.pop(item)O(N)O(N)
Removel.remove(…)O(N)O(N)
Reversel.reverse()O(N)O(N)
Slicel[x:y]O(y-x)O(y-x)
Sortl.sort()O(N*log(N))O(N*log(N))
Storel[i]=itemO(1)O(1)

有关更多信息,请参阅Python中列表的内部工作。

注意:元组具有相同的操作(不可变)和复杂性。

字典操作

OperationExamplesComplexity class
 Average caseAmortised Worst case
Cleard.clear()O(1)O(1)
Constructiondict(…)O(len(d))O(len(d))
Deletedel d[k]O(1)O(N)
Getd.get()O(1)O(N)
Iteration(key, value, item)for item in d:O(N)O(N)
Lengthlen(d)O(1)O(1)
Popd.pop(item)O(1)O(N)
Pop Itemd.popitem()O(1)O(1)
Returning Viewsd.keys()O(1)O(1)
Fromkeysd.fromkeys(seq)O(len(seq))O(len(seq))

注意: Defaultdict 具有与 dict 相同的操作,具有相同的时间复杂度,因为它继承自 dict。

设置操作

OperationExamplesComplexity class
 Average caseAmortised Worst case
Adds.add(item)O(1)O(N)
Clears.clear()O(1)O(1)
Copys.copy()O(N)O(N)
Containmentitem in/not in sO(1)O(N)
Creationset(…)O(len(s))O(len(s))
Discards.discard(item)O(1)O(N)
Differences1-s2O(len(s1))O(len(s1))
Difference Updates1.difference_update(s2)O(len(s2))
Equalitys1==s2, s1!=s2O(min(len(s1), len(s2)))O(min(len(s1), len(s2)))
Intersections1 & s2O(min(len(s1), len(s2)))O(min(len(s1), len(s2)))
Iterationfor item in s:O(N)O(N)
Is Subsets1<=s2O(len(s1))O(len(s1))
Is Supersets1>=s2O(len(s2))O(len(s1))
Pops.pop()O(1)O(N)
Unions1|s2O(len(s1)+len(s2))
Symmetric Differences1^s2len(s1)O(len(s1)*len(s2))

有关更多信息,请参阅Python中 Set 的内部工作

注意:冻结集具有相同的操作(不可变)和复杂性。