[英]Why is filecmp.cmp slow for huge files even when its 'shallow' parameter is True?
我編寫了一個Python腳本來比較兩個目錄中的文件,使用filecmp.cmp
。 它工作,但剛才我嘗試運行它來收集大量文件。 這很慢。
文檔說當shallow
參數為true(默認情況下是這樣)時, filecmp.cmp
應該只比較os.stat
結果。
對於另一個大型jpg
文件集,腳本運行得更快。 我想知道為什么文件大小比文件數更大的效果,就像它只檢查os.stat
。
我認為shallow
參數的文檔有誤導性*。 傳遞shallow = True
並不一定會阻止filecmp.cmp
函數比較文件的內容。 如果您的文件大小相同但mtime
不同,則仍會檢查其內容。
您可以在Python安裝中看到cmp
的實現,或者您可以查看Python源代碼庫中的(當前時刻)源代碼 。
以下是cmp
的相關內容:
def cmp(f1, f2, shallow=True):
# long docstring removed
s1 = _sig(os.stat(f1))
s2 = _sig(os.stat(f2))
if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG:
return False
if shallow and s1 == s2:
return True
if s1[1] != s2[1]:
return False
# rest of function, which calls a helper to do the actual file contents comparisons
_sig
幫助器函數返回從文件的stat
數據結構中提取的值的元組。 元組值是文件類型,文件大小及其mtime
(通常是上次修改文件內容的時間)。
我在代碼摘錄中包含的測試嘗試根據這些元數據快速確定兩個文件是否相同。 如果任一文件不是“常規”文件(因為它是目錄或特殊系統文件),則認為它們不相等。 而且,如果它們的大小不同,它們就不可能相等。
shallow
參數的作用是允許快速的陽性測試。 如果shallow
為true且文件具有相同的大小和mtime
,則filecmp.cmp
將假定文件相同。
我懷疑你的程序中發生的是你當前目錄中有許多文件大小完全相同(可能是因為內容非常相似,或者因為文件大小是由數據格式修復的)。 您之前的數據集沒有那么多相同大小的文件,因此您的代碼能夠快速排除它們。
*我認為filecmp.cmp
的文檔字符串是如此誤導,它表明存在錯誤(或者因為它沒有正確描述行為,或者因為實際的實現不正確而應該修復以匹配文檔)。 看起來我並不孤單。 這是一個關於這個問題的錯誤報告 ,雖然它已經好幾年沒有更新了。 我會用這個問題的鏈接ping這個bug,也許有人會努力修復它!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.