Python實現快速大檔案比較程式碼解析
阿新 • • 發佈:2020-09-07
問題
假如,在有兩個大檔案分別儲存了大量的資料,資料其實很簡單就是一堆字串,每行儲存一條,如何快速篩選出兩個檔案的異同之處麼,或者如何篩選出兩個檔案中不同的元素呢?
剛開始我是通過最簡單的方法,利用for迴圈去一個個的判斷,時間複雜度為m的n次冪,當然當檔案數量級為十萬或者百萬時,速率簡直慢到了極點。
解決方法
利用set()的different(方法)可快速比較,兩個set集合的不同之處,也就是對集合進行數學運算
假設:資料1擁有858882條記錄,資料2有360029條記錄,快速挑選出資料2中而不存在與資料1中的資料
方法:先將兩個檔案中的資料讀入兩個list:data1和data2,然後通過:set(data2).difference(set(data1)),獲取data2與data1的差集
下面為一個小的demo,可以看到近百萬級的資料,比較出差集也就需要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",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最多可以存放多少條資料呢?
python中list最多可以存放多少條資料呢?
對於這個問題,有個網友調研了python的文件,結果跟計算機的效能相關
64位機器:2^63-1=9223372036854775807
32位機器:2^31-1=2147483647
import sys
print(sys.maxsize)
print(pow(2,63)-1)
9223372036854775807
9223372036854775807
集合set的操作
內建函式 | 作用 |
---|---|
add() | 為集合新增元素 |
clear() | 移除集合中的所有元素 |
copy() | 拷貝一個集合 |
difference() | 返回多個集合的差集 |
difference_update() | 移除集合中的元素,該元素在指定的集合也存在。 |
discard() | 刪除集合中指定的元素 |
intersection() | 返回集合的交集 |
intersection_update() | 返回集合的交集。 |
isdisjoint() | 判斷兩個集合是否包含相同的元素,如果沒有返回 True,否則返回 False。 |
issubset() | 判斷指定集合是否為該方法引數集合的子集。 |
issuperset() | 判斷該方法的引數集合是否為指定集合的子集 |
pop() | 隨機移除元素 |
remove() | 移除指定元素 |
symmetric_difference() | 返回兩個集合中不重複的元素集合。 |
symmetric_difference_update() | 移除當前集合中在另外一個指定集合相同的元素,並將另外一個指定集合中不同的元素插入到當前集合中。 |
union() | 返回兩個集合的並集 |
update() | 給集合新增元素 |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。