Python實(shí)現(xiàn)快速大文件比較代碼解析
問題
假如,在有兩個(gè)大文件分別存儲(chǔ)了大量的數(shù)據(jù),數(shù)據(jù)其實(shí)很簡單就是一堆字符串,每行存儲(chǔ)一條,如何快速篩選出兩個(gè)文件的異同之處么,或者如何篩選出兩個(gè)文件中不同的元素呢?
剛開始我是通過最簡單的方法,利用for循環(huán)去一個(gè)個(gè)的判斷,時(shí)間復(fù)雜度為m的n次冪,當(dāng)然當(dāng)文件數(shù)量級(jí)為十萬或者百萬時(shí),速率簡直慢到了極點(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,然后通過:set(data2).difference(set(data1)),獲取data2與data1的差集
下面為一個(gè)小的demo,可以看到近百萬級(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è)問題,有個(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è)集合是否包含相同的元素,如果沒有返回 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() | 給集合添加元素 |
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python比較文件夾比另一同名文件夾多出的文件并復(fù)制出來的方法
這篇文章主要介紹了Python比較文件夾比另一同名文件夾多出的文件并復(fù)制出來的方法,涉及Python針對(duì)文件與文件夾的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03小白教你PyCharm從下載到安裝再到科學(xué)使用PyCharm2020最新激活碼
這篇文章主要介紹了PyCharm最新版從下載到安裝再到科學(xué)使用PyCharm2020最新激活碼,需要的朋友可以參考下2020-09-09Python 字符串轉(zhuǎn)換為整形和浮點(diǎn)類型的方法
今天小編就為大家分享一篇Python 字符串轉(zhuǎn)換為整形和浮點(diǎn)類型的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python采集股票數(shù)據(jù)并制作可視化柱狀圖
這篇文章主要介紹了如何利用Python采集股票數(shù)據(jù)并制作可視化柱狀圖,文中的示例代碼講解詳細(xì),快來跟上小編一起動(dòng)手嘗試一下吧2022-04-04