【发布时间】:2011-12-19 19:59:50
【问题描述】:
我正在编写一个文件比较函数。我知道filecmp.cmp,但在我的数据集中,预计很多文件都是相同的,所以我认为与其比较每个潜在的匹配项,不如实现一个可以比较它们的多文件比较一次全部。 (另外,由于我是 python 新手,我认为这是一个很好的学习练习。)它似乎进展顺利。到目前为止,事实上,通过一些输入,它比 unix 的 cmp 更快(这实际上让我有点担心,因为我不太相信这是可能的,因此认为我的实现可能有问题!)
所以,我已经编写了代码,但我现在正在尝试确定每次读取的理想块大小。我的一部分认为检索到的数据无论如何都必须进行比较,所以我一次能进入内存的次数越多越好,但我想知道 Python 数据结构是否存在可能会影响到这一点的限制。例如,我正在维护可能很大的块列表,并使用键是读取块的字典。
那么,我应该在 python 内置数据结构中注意哪些可能会影响这一点,或者这是否只能由硬件确定,应该通过在特定机器上进行分析来确定?
读回来我意识到这不是最明确的问题,但(尽管尝试)我不知道如何澄清它。如果这样可以使事情更清楚,我很乐意发布我的代码,但它比您的平均代码示例要长一点(虽然不是太糟糕)。如果需要进一步澄清,请发表评论。
谢谢。
更新重新。 SHA1: 我仅在 2 个相同的输入文件上测试了我的算法与 SHA1 的对比(实际数据中预计会更多),每个文件运行 100 次。我意识到这不是一个彻底的测试,但结果不同,值得评论。
(在任何一次测试中,计算机都没有承受任何其他负载,尽管我在 cmets 中说过,这不是在目标计算机上运行,而是在具有相当合理规格的计算机上运行。两者都测试有可能在两个线程中运行;也就是说 SHA1 发生在两个线程中,并且为我启动了两个线程,但由于实现,只有一个线程会被使用。单线程 SHA1 版本需要更长的时间。两个测试都读取一次相同大小的块。给出三组结果。)
现在我很困惑。 cmets (re. SHA1) 对吗?因此,这表示执行错误还是发生了其他事情?
SHA1:
real 5m35.865s 6m17.737s 5m57.010s
user 10m18.963s 11m34.178s 10m58.760s
sys 0m47.030s 0m52.707s 0m47.807s
我的:
real 3m47.185s 4m31.548s 4m40.628s
user 2m47.849s 3m26.207s 3m36.013s
sys 0m59.193s 1m5.139s 1m4.406s
【问题讨论】:
-
你只想知道哪些文件是相等的吗?还是您需要有关差异的详细信息?如果是前者,只需比较文件的 SHA1 哈希值即可。
-
如果 SHA1 太慢并且您不需要加密安全性,则使用另一个校验和。
-
@SvenMarnach,我只需要知道它们是否相等,但可能会有大量相同的大文件,我认为这样做可以避免计算开销每个文件的哈希值(以及极不可能发生哈希冲突的可能性!)
-
@agf:在我的机器上,计算一个 SHA1 至少比从磁盘读取快一百倍,所以这永远不会成为瓶颈。
-
@tjm:与从磁盘读取文件的成本相比,计算文件 SHA1 的成本完全可以忽略不计。 SHA1 哈希是 160 位。您将永远不会遇到哈希冲突。
标签: python performance optimization data-structures python-3.x