Windows上的Python。为什么阅读文本比二进制文件慢8倍?

时间:2017-11-17 16:12:56

标签: python windows python-3.x performance

我在Windows 10(64位)上运行python 3.6,具有快速SSD,32GB RAM和非常快的处理器(AMD Threadripper)。我也在英特尔i7上运行类似的结果。我打开大小约为5MB的XML文本文件,即使使用lxml,也会发现性能非常慢。我将问题归结为磁盘读取性能。如果我加载为二进制文件,它会快8倍。使用已存在于磁盘缓存中的文件执行以下测试。在这些运行期间,磁盘从未被击中。用冷读数获得了类似的结果。

%%timeit
with open(xmlpath + fn, 'rb') as f:
    r = f.read()
1.66 ms ± 31.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
with open(xmlpath + fn, 'r', encoding='UTF-8') as f:
    r = f.read()
13.7 ms ± 32.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

我知道必须为文本版本处理编码,但速度慢8倍似乎在快速处理器上运行过度。此外,1.6ms读取这样一个已经在缓存中的小文件似乎很慢。用Passmark测量的磁盘性能如预期的那样> 2GB / S。

任何意见/建议将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

当您使用rb时,可以直接在最终缓冲区内存(r)中使用无限/非常大的块大小读取文件。

当您使用r时,必须使用较小的块大小读取文件,以便能够对块进行后处理。在\r字符之前移除\n字符(如果它没有按字符处理char,这将是最简单但最慢的方式)

如果你有能力复制内存(r模式没有),我建议:

with open(xmlpath + fn, 'rb') as f:
    r = f.read().decode('UTF-8').replace('\r','')

还可以节省解码功能替换为评论说明:

with open(xmlpath + fn, 'r', newline="") as f:
    r = f.read()