如何利用Python快速統計文本的行數
通常我們會用wc -l來統計文件行數,不過用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快速統計文本的行數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 淺析Python字符串中的r和u的區別
- 解決docker掛載的目錄無法讀寫問題
- Python使用psutil庫對系統數據進行采集監控的方法
- 使用Ray集群簡單創建Python分佈式應用程序
- 淺談Python xlwings 讀取Excel文件的正確姿勢