如何利用Python快速統(tǒng)計(jì)文本的行數(shù)
??通常我們會用wc -l來統(tǒng)計(jì)文件行數(shù),不過用Python統(tǒng)計(jì)也很簡單。
要快速統(tǒng)計(jì)一個(gè)文本文件中的行數(shù),其實(shí)就是要統(tǒng)計(jì)這個(gè)文本文件中換行符的個(gè)數(shù)。為了盡量提高速度,我們需要盡量多讀一些文本然后一起處理。統(tǒng)計(jì)換行符的個(gè)數(shù)可以用bytes
內(nèi)置的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略有區(qū)別,如果要跟wc -l一致的話,可以將帶注釋的行刪掉。
這里沒有處理universal newline
、忽略空行等邏輯,如果需要這些功能,程序會變得復(fù)雜一些。
使用三個(gè)文本文件進(jìn)行測試,分別有一千萬行、一億六千萬行、六億四千萬行。先用wc -l運(yùn)行兩次,然后用Python的wc.py。
運(yùn)行結(jié)果:
[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
實(shí)際上是比wc -l更快的,主要因?yàn)榧?code>Python的步驟很少,大部分時(shí)間都在read(),count()這樣的C實(shí)現(xiàn)的過程中。wc更慢的原因猜想可能是默認(rèn)的緩沖區(qū)更小,所以需要更多的read()
到此這篇關(guān)于如何利用Python快速統(tǒng)計(jì)文本的行數(shù)的文章就介紹到這了,更多相關(guān)Python快速統(tǒng)計(jì)文本的行數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?不設(shè)計(jì)?do-while?循環(huán)結(jié)構(gòu)的理由
Python作為一種語言不支持do-while循環(huán)。?但是,我們可以采用一種變通方法來模擬do-while循環(huán)?。下面通過本文給大家分享下Python?不設(shè)計(jì)do-while?循環(huán)結(jié)構(gòu)的理由,需要的朋友可以參考下2022-01-01Python?日期和時(shí)間處理教程之datetime?模塊的使用示例詳解
Python 中的日期不是獨(dú)立的數(shù)據(jù)類型,但我們可以導(dǎo)入一個(gè)名為 datetime 的模塊來使用日期作為日期對象,這篇文章主要介紹了Python?日期和時(shí)間處理教程:datetime?模塊的使用,需要的朋友可以參考下2023-10-10python tkinter GUI繪制,以及點(diǎn)擊更新顯示圖片代碼
這篇文章主要介紹了python tkinter GUI繪制,以及點(diǎn)擊更新顯示圖片代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python+tkinter使用40行代碼實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Python+tkinter使用40行代碼實(shí)現(xiàn)計(jì)算器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01python之基數(shù)排序的實(shí)現(xiàn)
這篇文章主要介紹了python之基數(shù)排序的實(shí)現(xiàn),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07基于Python實(shí)現(xiàn)對Excel工作表中的數(shù)據(jù)進(jìn)行排序
在Excel中,排序是整理數(shù)據(jù)的一種重要方式,它可以讓你更好地理解數(shù)據(jù),本文將介紹如何使用第三方庫Spire.XLS?for?Python通過Python來對Excel中的數(shù)據(jù)進(jìn)行排序,需要的可以參考下2024-03-03