我一直在研究一个
python脚本来分析CSV.这些文件中有些文件相当大(1-2百万条记录),脚本需要几个小时才能完成.
我将记录从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有更多的指示.
那么这里发生了什么?这里有原则可以申请到其他程序吗?有没有场景比现在快十倍?
编辑:正如@HappyLeapSecond指出的那样,我并不太清楚在timeit里面发生了什么.差异已经消失了如下:
>>> def for_list():
... data = [x for x in range(1000)]
... for d in data:
... bunk = d**d
...
>>> def while_list():
... data = [x for x in range(1000)]
... while data:
... d = data.pop(0)
... bunk = d**d
>>> timeit.timeit(while_list, number=1000)
12.006330966949463
>>> timeit.timeit(for_list, number=1000)
11.847280025482178
这使得我的“真实”剧本非常奇怪,这么简单的改变.我最好的猜测是迭代方法需要更多的交换?我有一个40G交换分区,脚本填充了大约15-20G的.会弹出减少交换?