【发布时间】:2018-11-27 21:08:48
【问题描述】:
通常为了节省一些时间,我希望我们在本地函数中使用 n = len(s)。 我很好奇哪个呼叫更快或它们相同?
while i < len(s):
# do something
对
while i < n:
# do something
应该没有太大的区别,但是使用len(s),我们需要先到达s,然后调用s.length。这是 O(1) + O(1)。但是使用 n,它是 O(1)。我假设是这样。
【问题讨论】:
-
O(1) + O(1)仍然是O(1)。在担心缓存返回值之前,您应该分析您的代码以查看对len(s)的重复调用是否会产生任何重大开销。请注意,如果s的值在循环中发生变化,则这样做是不正确的。 -
显而易见的含义是
s在循环内不会改变。任何运行时优化都会使这两个表达式等效。但是,显而易见的 (?) 答案是您询问了错误的实体:time 每次使用timeit并查看在您的应用程序中一个是否比另一个更快。 -
过早的优化是万恶之源...除非这是时间关键过程的内部循环,否则您应该做最可维护的事情,而不是最快的事情... 这两个不做同样的事情的事实:一个对块中的长度变化敏感,而另一个则不敏感。
-
@Pythoner Big-Oh 表示法是“理论上的”。如果您不是在谈论算法复杂性,那就不要谈论大哦。
-
如果正确的意思是正确的,那肯定是不正确的。为了准确和正确,您可以说“它具有相同的时间复杂度但更高的常数因子”