gpt4 book ai didi

python - 为什么在没有换行符的情况下读取文件会更快?

转载 作者:太空狗 更新时间:2023-10-29 17:28:34 24 4
gpt4 key购买 nike

在 Python 3.6 中,如果有换行符,读取文件的时间会更长。如果我有两个文件,一个有换行符,一个没有换行符(但它们具有相同的文本),那么带有换行符的文件将花费大约 100-200% 的时间来阅读。我提供了一个具体的例子。

第 1 步:创建文件

sizeMB = 128
sizeKB = 1024 * sizeMB

with open(r'C:\temp\bigfile_one_line.txt', 'w') as f:
for i in range(sizeKB):
f.write('Hello World!\t'*73) # There are roughly 73 phrases in one KB

with open(r'C:\temp\bigfile_newlines.txt', 'w') as f:
for i in range(sizeKB):
f.write('Hello World!\n'*73)

第 2 步:使用单行和时间性能读取文件

IPython

%%timeit
with open(r'C:\temp\bigfile_one_line.txt', 'r') as f:
text = f.read()

输出

1 loop, best of 3: 368 ms per loop

第三步:读取多行和时间性能的文件

IPython

%%timeit
with open(r'C:\temp\bigfile_newlines.txt', 'r') as f:
text = f.read()

输出

1 loop, best of 3: 589 ms per loop

这只是一个例子。我已经在许多不同的情况下对此进行了测试,他们做同样的事情:

  1. 从 1MB 到 2GB 的不同文件大小
  2. 使用 file.readlines() 代替 file.read()
  3. 在单行文件中使用空格而不是制表符('\t')(即'Hello World!')

我的结论是,带有换行符 ('\n') 的文件比没有换行符的文件读取时间更长。但是,我希望所有角色都受到相同的对待。在读取大量文件时,这会对性能产生重要影响。 有人知道为什么会这样吗?

我正在使用 Python 3.6.1、Anaconda 4.3.24 和 Windows 10。

最佳答案

当您在 Python 中以文本模式(默认)打开文件时,它会使用所谓的“通用换行符”(在 PEP 278 中引入,但后来随着 Python 3 的发布而有所改变)。通用换行符的意思是,无论文件中使用何种换行符,您在 Python 中只会看到 \n。因此,包含 foo\nbar 的文件与包含 foo\r\nbarfoo\rbar 的文件看起来相同(因为 \n\r\n\r 都是某些操作系统在某些时候使用的行结束约定。

提供这种支持的逻辑可能是导致性能差异的原因。即使文件中的 \n 字符没有被转换,代码也需要比非换行符更仔细地检查它们。

我怀疑如果您以不提供此类换行支持的二进制模式打开文件,您看到的性能差异将会消失。您还可以将 newline 参数传递给 Python 3 中的 open,根据您提供的确切值,它可以有不同的含义。我不知道任何特定值会对性能产生什么影响,但如果您看到的性能差异对您的程序真的很重要,则可能值得测试。我会尝试传递 newline=""newline="\n"(或者您平台的常规行结尾是什么)。

关于python - 为什么在没有换行符的情况下读取文件会更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46415568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com