为什么filecmp.cmp对于大文件来说速度慢,即使它的'shallow'参数为True?

时间:2014-04-21 06:49:47

标签: python python-3.x file-comparison

我使用filecmp.cmp编写了一个Python脚本来比较两个目录中的文件。它工作,但刚才我尝试运行它来收集大量文件。这很慢。

文档说明当shallow参数为true时(默认情况下),filecmp.cmp只应比较os.stat个结果。

对于另一大集jpg个文件,脚本运行得更快。我想知道为什么文件大小比文件数量更大的效果,就像它只检查os.stat一样。

1 个答案:

答案 0 :(得分:2)

我认为shallow参数的文档具有误导性*。传递shallow = True并不一定会阻止filecmp.cmp函数比较文件的内容。如果您的文件大小相同但mtime不同,则仍会检查其内容。

您可以在Python安装中看到cmp的实现,或者您可以在Python source repository中查看(截至当前时的当前)源代码。

以下是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为真并且文件大小相同且mtime,则filecmp.cmp将假定文件相同。

我怀疑你的程序中发生的是你当前目录中有许多文件大小完全相同(可能是因为内容非常相似,或者因为文件大小是由数据格式修复的)。您以前的数据集没有那么多相同大小的文件,因此您的代码能够快速排除它们。

*我认为filecmp.cmp的docstring是如此误导以至于它表明存在错误(或者因为它没有正确描述行为,或者因为实际的实现不正确而应该修复匹配文档)。而且看起来我并不孤单。 Here is a bug report关于这个问题,虽然它已经好几年没有更新了。我会用这个问题的链接来ping这个bug,也许有人会努力修复它!