Python高效统计文本行数的实现与性能对比
本文介绍如何使用Python高效统计文本文件行数。通过读取二进制数据并利用bytes的count方法,可显著提升处理速度。实测显示,Python方案在一千万至六亿四千万行的大文件测试中,耗时低于系统命令wc -l,主要得益于C底层实现的优化。
Python统计行数的高效实现
在Linux系统中,我们通常使用wc -l命令来统计文件的行数,但实际上,使用Python来实现这一功能同样简便且高效。
统计文本文件行数的核心在于计算文件中换行符的数量。为了最大化处理速度,应当尽可能多地读取文本内容,然后一次性进行处理。Python内置的bytes类型提供了count方法,可以高效地统计特定字节序列的出现次数。
具体实现代码如下:
核心代码与逻辑说明
from __future__ import print_function
import time
if __name__ == '__main__':
import sys
start = time.time()
with open(sys.argv[1],'rb') as f:
count = 0
last_data = '\n'
while True:
data = f.read(0x400000)
if not data:
break
count += data.count(b'\n')
last_data = data
if last_data[-1:] != b'\n':
count += 1 # Remove this if a wc-like count is needed
end = time.time()
print(count)
print((end-start) * 1000)
上述代码逻辑中,我们将文件末尾没有换行符的剩余部分也计为一行,这与wc -l的行为略有不同。若需严格保持与wc -l一致的结果,可删除代码中带有注释的那一行。
当前示例未处理universal newline模式或忽略空行等复杂逻辑。如果业务场景需要这些功能,程序代码将相应变得更加复杂。
我们使用三个不同规模的文本文件进行测试,行数分别为一千万、一亿六千万和六亿四千万。测试流程包括两次执行wc -l命令,随后执行Python编写的wc.py脚本。
具体的运行结果如下所示:
性能测试与结果分析
[root@yz- test]# docker run -it --rm -v `pwd`:/opt/workspace python:3 bash -c "cd /opt/workspace && time wc -l text.txt && time wc -l text.txt && time python3 wc.py text.txt"
10000000 text.txt
real 0m0.086s
user 0m0.072s
sys 0m0.013s
10000000 text.txt
real 0m0.080s
user 0m0.060s
sys 0m0.019s
10000000
64.38159942626953
real 0m0.150s
user 0m0.100s
sys 0m0.033s
[root@yz- test]# docker run -it --rm -v `pwd`:/opt/workspace python:3 bash -c "cd /opt/workspace && time wc -l text3.txt && time wc -l text3.txt && time python3 wc.py text3.txt"
160000000 text3.txt
real 0m1.322s
user 0m0.991s
sys 0m0.318s
160000000 text3.txt
real 0m1.313s
user 0m0.966s
sys 0m0.341s
160000000
838.7012481689453
real 0m0.908s
user 0m0.595s
sys 0m0.297s
[root@yz- test]# docker run -it --rm -v `pwd`:/opt/workspace python:3 bash -c "cd /opt/workspace && time wc -l text4.txt && time wc -l text4.txt && time python3 wc.py text4.txt"
640000000 text4.txt
real 0m5.805s
user 0m4.349s
sys 0m1.455s
640000000 text4.txt
real 0m5.787s
user 0m4.342s
sys 0m1.445s
640000000
3323.5926628112793
real 0m3.399s
user 0m2.255s
sys 0m1.108s
从结果可以看出,Python的执行速度实际上比wc -l更快。这主要是因为纯Python代码涉及的步骤较少,大部分时间消耗在read()和count()等由C语言实现的底层操作中。相比之下,wc命令较慢的原因可能是其默认缓冲区较小,导致需要执行更多的read()操作。
至此,关于如何利用Python快速统计文本行数的介绍已完成。如需了解更多相关Python快速统计文本行数内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









