【发布时间】:2012-09-10 16:11:21
【问题描述】:
刚刚得到一个奇怪的结果,我试图理解。我有一个大约 325k 行(列表)的数据集,每行大约 90 个项目(字符串、浮点数等 - 这并不重要)。说,如果我想对所有项目进行一些处理,那么我可以使用 2 "for"s 对它们进行迭代:
for eachRow in rows:
for eachItem in eachRow:
# do something
在我的系统中,这段代码执行了 41 秒。但是,如果我用一系列索引访问( eachRow[0]、eachRowm[1] 直到 eachRow[89] )替换嵌套循环,执行时间就会下降到 25 秒。
for eachRow in rows:
eachRow[0] # do something with this item
eachRow[1] # do something with this item
..
eachRow[89] # do something with this item
当然,写这样的代码不是一个好主意——我只是在寻找一种提高数据处理性能的方法,偶然发现了这种奇怪的方法。有cmets吗?
【问题讨论】:
-
python 中的索引访问速度非常快......这就是为插入/删除设置的列表计算量很大/查找速度很快
-
但它的开销仍然大于查找...虽然不多但分布在 300k 行上可能是一个很大的数量
-
您能否展示一个我们可以尝试分析的可重现示例?
-
为了在不“手动展开循环”的情况下获得更好的性能,您应该尝试使用函数式范式 - 即为“map”函数提供您想要执行的转换和您想要执行的完整数组正在努力。
-
我的猜测是,除了索引之外,还有其他地方发生了变化。正如 David Robinson 建议的那样,发布两个完全正常工作的函数,它们使用两种方法做同样的事情,我们也可以尝试运行比较。
标签: python performance for-loop iteration