算法符号......
某些原则适用于任何计算机语言的优化,Python 也不例外。不要随意优化 :编写程序而不考虑可能的优化,而是集中精力确保代码清晰,正确且易于理解。如果它在你完成时太大或太慢,那么你可以考虑优化它。
记住 80/20 规则 :在许多领域,你可以得到 80%的结果和 20%的努力(也称为 90/10 规则 - 这取决于你与谁交谈)。每当你要优化代码时,使用分析来找出 80%执行时间的去向,以便你知道在哪里集中精力。
始终运行之前和之后基准测试 :你如何知道你的优化实际上有所作为?如果你的优化代码仅比原始版本稍微更快或更小,请撤消更改并返回原始的清晰代码。
使用正确的算法和数据结构:当有 O(n log n)快速排序可用时,不要使用 O(n2)
冒泡排序算法对一千个元素进行排序。同样,当你可以使用 O(log n)二叉树或 O(1)
Python 哈希表时,不要在需要 O(n)
搜索的数组中存储一千个项目。
有关更多信息,请访问以下链接… Python 加速
以下 3 种渐近符号主要用于表示算法的时间复杂度。
-
Θ表示法 :theta 表示法从上方和下方界定函数,因此它定义了精确的渐近行为。获取表达式的 Theta 表示法的一种简单方法是删除低阶项并忽略前导常量。例如,请考虑以下表达式。3n3 + 6n2 + 6000 =Θ(n3)下降低阶项总是很好,因为总是有一个 n0,之后Θ(n3)的值高于Θn2,而不管所涉及的常数如何。对于给定函数
g(n)
,我们表示Θ(g(n)
)遵循一组函数。Θ(g(n)
)= {f(n)
:存在正常数 c1,c2 和 n0,使得 0 <= c1g(n)
<=f(n)
<= c2g(n)
对于所有 n> = n0}上述定义意味着,如果f(n)
是 g(n)的θ,那么值f(n)
总是在 c1g(n)
和 c2 之间对于大的 n 值(n> = n0),g(n)
。θ的定义还要求对于大于 n0 的 n 值,f(n)
必须是非负的。 -
Big O 表示法 :Big O 表示法定义算法的上限,它仅从上面绑定一个函数。例如,考虑插入排序的情况。在最佳情况下需要线性时间,在最坏情况下需要二次时间。我们可以有把握地说插入排序的时间复杂度是 O(n ^ 2)。注意,O(n ^ 2)也包括线性时间。如果我们使用Θ表示法来表示插入排序的时间复杂度,我们必须使用两个语句来表示最佳和最差情况:
-
插入排序的最坏情况时间复杂度是Θ(n ^ 2)。
-
插入排序的最佳案例时间复杂度是Θ(n)。
当我们只有算法的时间复杂度的上限时,Big O 表示法很有用。很多时候,我们只需简单地查看算法即可轻松找到上限。O(g(n)
)= {f(n)
:存在正常数 c 和 n0,使得对于所有 n> = n0,0 <= f(n)
<= cg(n)
- Ω表示法 :正如 Big O 表示法在函数上提供渐近上界,Ω表示法提供渐近下界。当我们具有算法的时间复杂度的下限时,Ω表示法<可能是有用的。正如前一篇文章中所讨论的,算法的最佳案例性能通常没有用,Omega 符号是三者中使用最少的符号。对于给定函数
g(n)
,我们用Ω(g(n)
)表示函数集。Ω(g(n)
)= {f(n)
:存在正常数 c 和 n0,使得对于所有 n> = n0},0 <=cg(n)
<=f(n)
。让我们在这里考虑相同的插入排序示例。插入排序的时间复杂度可写为Ω(n),但它不是一个关于插入排序的非常有用的信息,因为我们通常对最坏情况感兴趣,有时在平均情况下感兴趣。