Skip to main content
 首页 » 编程设计

python之为什么数组的直接索引比迭代快得多

2025年05月04日16dudu

只是一些 Python 代码的例子:

nums = [1,2,3] 
start = timer() 
for i in range(len(nums)): 
  print(nums[i]) 
end = timer() 
 
print((end-start)) #computed to 0.0697546862831 
 
 
start = timer() 
print(nums[0]) 
print(nums[1]) 
print(nums[2]) 
end = timer() 
 
print((end-start)) #computed to 0.0167170338524 

我知道循环中会花费一些额外的时间,因为 i 的值必须递增几次,但是这两种不同方法的运行时间之间的差异似乎比我预期的要大很多。幕后是否发生了我没有考虑到的其他事情?

请您参考如下方法:

简短的回答:不是,除非循环非常小。 for 循环的开销很小,但是您这样做的方式效率很低。通过使用 range(len(nums)),您可以有效地创建另一个列表并对其进行迭代,然后执行相同的索引查找。试试这个:

for i in nums: 
    print(i) 

我的结果符合预期:

>>> import timeit 
>>> timeit.timeit('nums[0];nums[1];nums[2]', setup='nums = [1,2,3]') 
0.10711812973022461 
>>> timeit.timeit('for i in nums:pass', setup='nums = [1,2,3]') 
0.13474011421203613 
>>> timeit.timeit('for i in range(len(nums)):pass', setup='nums = [1,2,3]') 
0.42371487617492676 

对于更大的列表,循环的优势变得明显,因为通过索引访问元素的增量成本超过了循环的一次性成本:

>>> timeit.timeit('for i in nums:pass', setup='nums = range(0,100)') 
1.541944980621338 
timeit.timeit(';'.join('nums[%s]' % i for i in range(0,100)), setup='nums = range(0,100)') 
2.5244338512420654 

在 python 3 中,它更加强调迭代器而不是可索引列表,差异甚至更大:

>>> timeit.timeit('for i in nums:pass', setup='nums = range(0,100)') 
1.6542046590038808 
>>> timeit.timeit(';'.join('nums[%s]' % i for i in range(0,100)), setup='nums = range(0,100)') 
10.331634456000756