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