0

を使用して、2 つのディレクトリ内のファイルを比較する Python スクリプトを作成しましたfilecmp.cmp。動作しますが、たった今、巨大なファイルのコレクションに対して実行してみました。とても遅かったです。

ドキュメントによると、shallowパラメーターが true の場合 (デフォルトでは true)、結果filecmp.cmpのみを比較する必要がありos.statます。

スクリプトは、別の大きなjpgファイルのコレクションに対してはるかに高速に実行されました。os.statチェックのみのように、ファイルサイズがファイル数よりも大きな影響を与えているのはなぜだろうか。

4

1 に答える 1

3

パラメータのドキュメントは誤解を招くと思いますshallow*。渡すことで、関数がファイルの内容を比較shallow = Trueできなくなるわけではありません。filecmp.cmpファイルのサイズが同じで が異なる場合mtimeでも、その内容はチェックされます。

Python インストールでの実装を確認するか、 Python ソース リポジトリcmpで (現時点で最新の) ソースを確認できます。

関連するビットは次の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(通常、ファイルの内容が最後に変更されたとき) です。

コードの抜粋に含めたテストでは、これらのメタデータに基づいて 2 つのファイルが同じかどうかをすばやく判断しようとします。いずれかのファイルが「通常の」ファイルでない場合 (ディレクトリまたは特別なシステム ファイルであるため)、それらは等しくないと見なされます。また、サイズが同じでない場合、同じにすることはできません。

パラメータが行うshallowことは、迅速な陽性テストを可能にすることです。shallowが true でファイルのサイズが同じである場合mtimefilecmp.cmpはファイルが等しいと想定します。

あなたのプログラムで起こっていると思われるのは、現在のディレクトリにまったく同じサイズのファイルが多数あることです (おそらく内容が非常に似ているため、またはファイルサイズがデータ形式によって固定されているため)。以前のデータ セットには同じサイズのファイルがそれほど多くなかったので、コードはそれらをすばやく除外できました。

* の docstring は誤解を招くため、バグを示していると思いますfilecmp.cmp(動作が適切に記述されていないか、実際の実装が正しくなく、ドキュメントに合わせて修正する必要があるため)。そして、私は一人ではないようです。数年間更新されていませんが、この問題に関するバグレポートがあります。この質問へのリンクを使用してバグを報告します。誰かが修正に取り組むかもしれません!

于 2014-04-21T08:17:13.813 に答える