使用 n = len(s) 而不是直接使用 len(s) 是否更快?

Is it faster to use n = len(s) instead of using len(s) directly?

通常为了节省一些时间,我希望我们在本地函数中使用 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)。我想是的。

必须更快。

  • 使用 n 您正在查找变量(字典)一次。
  • 使用len(s)你要找两次(len也是我们要找的函数)。然后调用函数。

这就是说,如果您在大多数情况下执行 while i < n:,您可以使用经典的 for i in range(len(s)): 循环,因为上边界不会改变,并且仅在开始时计算一次 range(这可能会导致您:为什么我不直接迭代元素或使用 enumerate

while i < len(s) 允许将您的索引与不同的列表进行比较。这就是重点。如果你固定边界,它就会变得不那么吸引人。

for 循环中,使用 continue 很容易跳过增量(就像忘记增量 i 并以无限 while循环)

你是对的,这里有一些基准:

s = np.random.rand(100)
n = 100

以上是设置。

%%timeit
50 < len(s)

86.3 ns ± 2.4 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

对战:

%%timeit
50 < n

36.8 ns ± 1.15 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

但话又说回来,很难想象 ~60ns 级别的差异会影响速度。除非你打电话 len(s) 数百万次。