我一直在编写一个python脚本来分析csv。其中一些文件相当大(100万到200万条记录),而脚本需要几个小时才能完成。在
我改变了记录的处理方式,从for-in
循环改为while
循环,而且速度提升非常显著。演示如下:
>>> def for_list():
... for d in data:
... bunk = d**d
...
>>> def while_list():
... while data:
... d = data.pop(0)
... bunk = d**d
...
>>> data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> import timeit
>>> timeit.timeit(for_list)
1.0698931217193604
>>> timeit.timeit(while_list)
0.14515399932861328
快了一个数量级。我从来没有看过python字节码,但我认为它可能很有说服力,但结果发现while_list
有更多的指令。在
怎么回事?这里有没有一个原则可以适用于其他项目?是否存在for
比while
快十倍的情况?在
编辑:正如@HappyLeapSecond所指出的,我不太清楚timeit
内部到底发生了什么,差异如下:
这让我很奇怪,我的“真正的”脚本加速这么简单的变化。我最好的猜测是迭代方法需要更多的交换?我有一个40G的交换分区,脚本可以填充大约15-20G。弹出会减少交换吗?在
while_list
正在对全局{timeit.timeit
不重置data
的值。^默认情况下,{for_list
和{while_list
之后,对while_list
的后续调用在执行0个循环后返回,因为data
已经是空的。在在每次调用}之前,需要重置
for_list
和{data
的值,以执行公平的基准测试。在pop(0)
是一个O(n)
操作。在长度为n
的循环中执行该操作会使while_list
具有总体时间复杂度{for_list
。因此,正如预期,for_list
更快,n
的长度越大,优势就越大。在相关问题 更多 >
编程相关推荐