我正在编写一个文件比较函数。我知道 filecmp.cmp
但在我的数据集中,预计很多文件都是相同的,所以我认为与其将每个潜在的匹配项相互比较,不如实现一个多文件- 文件比较,可以一次比较它们。 (另外,因为我是 python 的新手,所以我认为这是一个很好的学习练习。)它似乎进展顺利。到目前为止,实际上对于一些输入,它比 unix 的 cmp
更快(这实际上让我有点担心,因为我不太相信这是可能的,因此认为我的实现可能有问题! )
所以,我已经编写了代码,但我现在正在尝试确定每次读取的理想 block 大小是多少。我的一部分认为检索到的数据无论如何都必须进行比较,所以我一次可以进入内存的次数越多越好,但我想知道 python 数据结构是否存在限制,可能会影响到这一点。例如,我正在维护可能很大的 block 列表,并使用字典,其中键是读取的 block 。
那么,在 python 内置数据结构中我应该注意哪些可能会对此产生影响,或者这是否仅由硬件确定并且应该通过在特定机器上进行分析来确定?
回读我意识到这不是最明确的问题,但(尽管尝试过)我不确定如何澄清它。我很乐意发布我的代码,如果这会让事情变得更清晰,但它比你的平均代码示例长一点(虽然还不错)。如果需要进一步说明,请发表评论。
谢谢。
更新回复。 SHA1: 我已经在仅 2 个相同的输入文件(实际数据中预计会有更多)上测试了我的算法与 SHA1,每运行 100 次。我意识到这不是一个彻底的测试,但结果差异很大,值得评论。
(在这两项测试中,计算机都没有承受任何其他负载,尽管我在评论中说过,这不是在目标计算机上运行,而是在具有相当合理规范的计算机上运行。两者测试有可能在两个线程中运行;也就是说,SHA1 发生在两个线程中,并且为我启动了两个线程,但由于实现只使用了一个线程。单线程 SHA1 版本花费了更长的时间。两个测试都读取一次相同大小的 block 。给出三组结果。)
现在我很困惑。评论(关于 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
最佳答案
我建议你使用 binary search选择尺寸值的方法。
从一个较大的值(您知道太大的值)开始并将其减半。如果更快,再减半。如果慢了,就进入下半场。继续,直到达到最佳值。
关于Python 瓶颈;确定文件比较功能的最佳 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7972624/