Python 在循环之前计算一次列表的长度是否比在循环中重新计算列表快?

Python 在循环之前计算一次列表的长度是否比在循环中重新计算列表快?,python,performance,loops,for-loop,Python,Performance,Loops,For Loop,假设我们必须在循环中的某些计算中使用列表的长度。在每次计算中使用len(list),或者存储长度length=len(list),然后使用length,哪个更快?例如: for x in range(n): print(len(list_) + 1) 对 length = len(list_) for x in range(n): print(length + 1) 假设一个一般情况(n可以是任何值)。Python的列表将其长度存储在一个变量中,因此这两种方式没有太大区别 第

假设我们必须在循环中的某些计算中使用列表的长度。在每次计算中使用
len(list)
,或者存储长度
length=len(list)
,然后使用
length
,哪个更快?例如:

for x in range(n):
    print(len(list_) + 1)

length = len(list_)
for x in range(n):
    print(length + 1)

假设一个一般情况(
n
可以是任何值)。

Python的列表将其长度存储在一个变量中,因此这两种方式没有太大区别


第一个函数每次在循环中获取长度(这只是一个变量,len()函数中没有任何计算),第二个函数只执行一次。在我的测试中时间是一样的。

这里有一个简单的测试,使用@DSM建议的方法:

def direct_len(lst):
    total = 0
    for x in range(1000):
        total += len(lst) + 1

def precalc(lst):
    length = len(lst)
    total = 0
    for x in range(1000):
        total += length + 1

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("direct_len(list(range(100)))", setup="from __main__ import direct_len", number=10000))
    print(timeit.timeit("precalc(list(range(100)))", setup="from __main__ import precalc", number=10000))
通过以上内容,我在Windows 8上使用Python 3.5获得了以下结果:

1.3909554218576217
0.8262501212985289

访问单个存储变量要比访问函数并向其传递一个已访问的变量快得多

>>> import timeit
>>> timeit.timeit('x', setup='x=len([1,2])')
0.024496269777304097
>>> timeit.timeit('len(x)', setup='x=[1,2]')
0.10009170159894687

然而,正如我在报告中所说的,这并不重要。如果您调用的函数非常昂贵,这可能很重要,但这次不是这样。使用任何能使您的代码看起来更干净的工具。

为什么不使用
time.time()
对其进行测试并向我们报告?更棒的是,有一个完整的模块可以帮助您实现这一点,这样就避免了使用
time.time()时出现的许多问题
可以引入。这些代码块之间的唯一区别是访问变量并使用另一个访问的变量将其作为函数调用,而不是简单地访问变量。两者之间的唯一区别是前者调用函数并访问第二个变量,而后者则不调用。你认为哪个更快?在你做了一个有根据的猜测之后,运行一些测试并找出答案。然后忽略结果,使用任何看起来更干净的代码。它调用
。\uu\len\uu
方法,该方法只对内置容器进行属性查找。将长度存储在本地应该稍微快一点,但不要像那样凌乱代码,除非它是一个巨大的循环。实际上,您应该做的是保存
len(list_uz)+1
,并在代码中为该变量指定一个表示其用途的名称。为什么不告诉我们您的测试是什么,这样我们就能明白为什么他们是一样的?在我的测试中,访问保存的长度大约比反复调用
len
快四倍。我知道这一点。第一个看起来必须重复
len
函数
n
次。请注意,您对许多相同的开销进行计时,这掩盖了代码中实际不同的性能差异。出于兴趣,我想知道如果您运行此程序时,其中一个测试被注释掉,而另一个测试被注释掉,并以这种方式比较结果,结果是否会有很大的不同。@TigerhawkT3是的,我只是决定使用问题中提供的例子。将这些数字与您的示例中的变量access/
len
call进行比较,可以看出当添加一些功能时,这种差异很快就变得毫无意义了。@Tagc我不明白为什么这会改变任何东西。不管怎样,我试过了,如果我对其中一个测试进行评论,结果似乎是一样的。但请注意,在任何情况下,每次运行之间都有细微的差异。