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

标签 python arrays performance indexing iteration

只是一些 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/

相关文章:

python - 如何在Python中从字符串创建一个没有子列表的列表

python - 如何更快地读取/遍历/切片 Scipy 稀疏矩阵(LIL、CSR、COO、DOK)?

java - 通过将字符串(来自数组)分配为对象的参数之一,将其他参数保留为空,将字符串数组转换为对象列表

java - 逐个添加 2 个列表元素

python - 如何使用 Pandas 循环显示多个相关热图?

python - 我可以在 SQLAlchemy 中添加一个基于另一个数据库行的新项目吗?

arrays - 如何在AS3中制作2D矢量

c# - 将字符串拆分为多个元素

python - 为什么 random.shuffle 比使用 sorted 函数慢得多?

sql - 两个查询,一个使用 OR,一个使用 IN(),是否具有相同的性能?