只是一些 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
关于python - 为什么数组的直接索引比迭代快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36396695/