Python 中的性能问题:os.walk() + filecmp.dircmp().report_full_closu



我目前需要在增量数据迁移发生后比较目录。 我编写了一个python脚本来遍历源/目标列表,执行从源到目标的增量复制,然后立即比较每个目录中的文件和文件夹数量。 为了进行此比较,我们非常简单地使用:

对于 os.walk(destd) 中的 (path, dirs, files):

destFileCount += len(files)

destDirCount += len(dirs)

如果返回的文件/目录数量不同,我们调用另一段代码以查看究竟有什么不同。 为此,我们运行以下命令并将输出发送到文件:

filecmp.dircmp(sourced, destd).report_full_closure()

我们使用report_full_closure部分,因为我不知道另一种进行递归比较的方法。 然后,脚本在生成的文件中搜索以"only in"开头的行,并将它们打印到屏幕上,有效地向我们展示了差异。

无论效率低下,这在文件数低于 90,000 个左右的目录上就像一个魅力,但是一旦我们达到上限,脚本就会变得迟钝到无法将其用于此目的的程度。 我想我的问题可以分为以下几点:

  1. 我在使用这两个模块 [os.walk + filecmp.dircmp().report_full_closure()] 时是否犯了逻辑错误? 即,我真的节省了能够跳过 filecmp 的时间,还是我应该只做 filecmp 并完全跳过文件/目录计数?

  2. 有没有办法通过"缓存"一个文件以在另一个中使用来组合这两个函数?

  3. 有没有更快的方法来执行这些功能中的任何一个? 我已经搜索了高低,所以我猜没有。

我非常感谢您对此事的想法。 这个脚本已经变形并成长了很多,所以如果答案非常明显,请原谅我......谢谢米

我会做这样的事情:

dir_diff = filecmp.dircmp(sourced, destd)
if dir_diff.left_only or dir_diff.right_only:
    dir_diff.report_full_closure()

编辑:这是一个关于filecmp模块的好博客。

dircmp 返回的差异不准确可能有 2 个原因:1.它使用os.stat来比较文件(浅层比较),这在大多数情况下都很好,但您的要求可能会有所不同。2.有趣的文件 - 将文件重命名为目录等显示在通用下。所以,你也需要考虑dir_diff.common_funny。以下是修改后的代码:

dir_diff = filecmp.dircmp(sourced, destd)
if dir_diff.left_only or dir_diff.right_only or dir_diff.common_funny:
    dir_diff.report_full_closure()

最新更新