Python實(shí)現(xiàn)快速大文件比較代碼解析
問(wèn)題
假如,在有兩個(gè)大文件分別存儲(chǔ)了大量的數(shù)據(jù),數(shù)據(jù)其實(shí)很簡(jiǎn)單就是一堆字符串,每行存儲(chǔ)一條,如何快速篩選出兩個(gè)文件的異同之處么,或者如何篩選出兩個(gè)文件中不同的元素呢?
剛開(kāi)始我是通過(guò)最簡(jiǎn)單的方法,利用for循環(huán)去一個(gè)個(gè)的判斷,時(shí)間復(fù)雜度為m的n次冪,當(dāng)然當(dāng)文件數(shù)量級(jí)為十萬(wàn)或者百萬(wàn)時(shí),速率簡(jiǎn)直慢到了極點(diǎn)。
解決方法
利用set()的different(方法)可快速比較,兩個(gè)set集合的不同之處,也就是對(duì)集合進(jìn)行數(shù)學(xué)運(yùn)算
假設(shè):數(shù)據(jù)1擁有858882條記錄,數(shù)據(jù)2有360029條記錄,快速挑選出數(shù)據(jù)2中而不存在與數(shù)據(jù)1中的數(shù)據(jù)
方法:先將兩個(gè)文件中的數(shù)據(jù)讀入兩個(gè)list:data1和data2,然后通過(guò):set(data2).difference(set(data1)),獲取data2與data1的差集
下面為一個(gè)小的demo,可以看到近百萬(wàn)級(jí)的數(shù)據(jù),比較出差集也就需要1秒左右,效率不是一般的高
import time
t1 = time.time()
data1 = []
for i in open("inDB.txt","r",encoding="utf-8"):
i = i.strip("\n")
i = i.lower()
data1.append(i)
data2 = []
for i in open("data/18年.filename","r",encoding="utf-8"):
i = i.strip("\n")
i = i.lower()
data2.append(i)
newdata = set(data2).difference(set(data1))
t2 = time.time()
print(f"data1 length:\t{len(data1)}")
print(f"data2 length:\t{len(data2)}")
print(f"newdata length:\t{len(newdata)}")
print(f"time use:\t{round(t2 - t1,3)}s")

list最多可以存放多少條數(shù)據(jù)呢?
python中l(wèi)ist最多可以存放多少條數(shù)據(jù)呢?
對(duì)于這個(gè)問(wèn)題,有個(gè)網(wǎng)友調(diào)研了python的文檔,結(jié)果跟計(jì)算機(jī)的性能相關(guān)
64位機(jī)器:2^63-1=9223372036854775807
32位機(jī)器:2^31-1=2147483647
import sys
print(sys.maxsize)
print(pow(2,63)-1)
9223372036854775807
9223372036854775807
集合set的操作
| 內(nèi)置函數(shù) | 作用 |
|---|---|
| add() | 為集合添加元素 |
| clear() | 移除集合中的所有元素 |
| copy() | 拷貝一個(gè)集合 |
| difference() | 返回多個(gè)集合的差集 |
| difference_update() | 移除集合中的元素,該元素在指定的集合也存在。 |
| discard() | 刪除集合中指定的元素 |
| intersection() | 返回集合的交集 |
| intersection_update() | 返回集合的交集。 |
| isdisjoint() | 判斷兩個(gè)集合是否包含相同的元素,如果沒(méi)有返回 True,否則返回 False。 |
| issubset() | 判斷指定集合是否為該方法參數(shù)集合的子集。 |
| issuperset() | 判斷該方法的參數(shù)集合是否為指定集合的子集 |
| pop() | 隨機(jī)移除元素 |
| remove() | 移除指定元素 |
| symmetric_difference() | 返回兩個(gè)集合中不重復(fù)的元素集合。 |
| symmetric_difference_update() | 移除當(dāng)前集合中在另外一個(gè)指定集合相同的元素,并將另外一個(gè)指定集合中不同的元素插入到當(dāng)前集合中。 |
| union() | 返回兩個(gè)集合的并集 |
| update() | 給集合添加元素 |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python3 filecmp模塊測(cè)試比較文件原理解析
- 用python標(biāo)準(zhǔn)庫(kù)difflib比較兩份文件的異同詳解
- 通過(guò)Python模塊filecmp 對(duì)文件比較的實(shí)現(xiàn)方法
- python實(shí)現(xiàn)比較文件內(nèi)容異同
- Python讀取文件內(nèi)容的三種常用方式及效率比較
- Python實(shí)現(xiàn)比較兩個(gè)文件夾中代碼變化的方法
- Python比較文件夾比另一同名文件夾多出的文件并復(fù)制出來(lái)的方法
- python文件比較示例分享
- Python模塊學(xué)習(xí) filecmp 文件比較
相關(guān)文章
Python寫(xiě)捕魚(yú)達(dá)人的游戲?qū)崿F(xiàn)
這篇文章主要介紹了Python寫(xiě)捕魚(yú)達(dá)人的游戲?qū)崿F(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
200個(gè)Python?標(biāo)準(zhǔn)庫(kù)總結(jié)
這篇文章主要給大家分享了200個(gè)Python?標(biāo)準(zhǔn)庫(kù)總結(jié),主要對(duì)文本、數(shù)據(jù)類(lèi)型、數(shù)學(xué)等多個(gè)類(lèi)型總結(jié),既有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01
python爬蟲(chóng)中抓取指數(shù)的實(shí)例講解
在本篇文章里小編給大家整理了關(guān)于python爬蟲(chóng)中抓取指數(shù)的實(shí)例講解內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2020-12-12
利用PyCharm Profile分析異步爬蟲(chóng)效率詳解
這篇文章主要給大家介紹了關(guān)于如何利用PyCharm Profile分析異步爬蟲(chóng)效率的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PyCharm具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
關(guān)于 Python json中l(wèi)oad和loads區(qū)別
這篇文章主要介紹了關(guān)于 Python json中l(wèi)oad和loads區(qū)別,文章也有簡(jiǎn)單的說(shuō)明它們之間的相同點(diǎn),然后詳細(xì)介紹不同點(diǎn),需要的朋友可以參考一下文章的具體內(nèi)容2021-11-11
詳解用Python處理HTML轉(zhuǎn)義字符的5種方式
本文介紹了詳解用Python處理HTML轉(zhuǎn)義字符的5種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
win10下tensorflow和matplotlib安裝教程
這篇文章主要為大家詳細(xì)介紹了win10下tensorflow和matplotlib安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù)
這篇文章主要介紹了Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08

