Python瓶颈;确定文件比较函数的最佳块大小

Python瓶颈;确定文件比较函数的最佳块大小,python,performance,optimization,data-structures,python-3.x,Python,Performance,Optimization,Data Structures,Python 3.x,我正在写一个文件比较函数。我知道filecmp.cmp,但在我的数据集中,很多文件都是相同的,因此我认为与其相互比较每个可能的匹配,不如实现一个多文件比较,可以同时比较所有文件。(另外,因为我是python新手,所以我认为这是一个很好的学习练习。)到目前为止,它似乎进展顺利。事实上,通过一些输入,它比unix的cmp(这实际上让我有点担心,因为我不太相信这是可能的,因此认为我的实现可能有问题!) 所以,我已经编写了代码,但我现在正试图确定每次读取的理想块大小。我的一部分想法是,无论如何都必须对检

我正在写一个文件比较函数。我知道
filecmp.cmp
,但在我的数据集中,很多文件都是相同的,因此我认为与其相互比较每个可能的匹配,不如实现一个多文件比较,可以同时比较所有文件。(另外,因为我是python新手,所以我认为这是一个很好的学习练习。)到目前为止,它似乎进展顺利。事实上,通过一些输入,它比unix的
cmp
(这实际上让我有点担心,因为我不太相信这是可能的,因此认为我的实现可能有问题!)

所以,我已经编写了代码,但我现在正试图确定每次读取的理想块大小。我的一部分想法是,无论如何都必须对检索到的数据进行比较,因此,我一次能够进入内存的数据越多越好,但我想知道python数据结构是否存在可能影响这一点的限制。例如,我正在维护可能很大的块列表,并使用字典,其中键是读取块

那么,在python内置的数据结构中,我应该注意哪些可能会影响到这一点,或者这只是由硬件决定的,应该由特定机器上的评测来决定


回过头来看,我意识到这不是一个最清楚的问题,但(尽管有尝试)我不确定如何澄清它。我很乐意发布我的代码,如果这能让事情变得更清楚的话,但它比您的平均代码样本长一点(不过还不算太糟)。如果需要进一步澄清,请发表评论

谢谢


重新更新。SHA1: 我已经在2个相同的输入文件上测试了我的算法和SHA1(实际数据中预计会有更多),每运行100次。我意识到这不是一个彻底的测试,但结果不同,值得评论

(在这两个测试中,计算机没有承受任何其他负载,尽管我在评论中说了,这不是在目标机器上运行的,而是在一台规格相当合理的机器上运行的。这两个测试都有可能在两个线程中运行;也就是说,SHA1在两个线程中运行,而我的两个线程都启动了,但由于执行的原因只能使用一个。单线程SHA1版本需要更长的时间。两个测试一次读取相同大小的块。给出了三组结果。)

现在我很困惑。这些评论(re.SHA1)正确吗?因此,这是一个错误的实现的指示,还是发生了其他事情

SHA1:

地雷:

我建议您使用一种方法来选择大小值


从一个较大的值开始(您知道该值太大)然后将其减半。如果速度更快,则再次减半。如果速度较慢,则转到下半个间隔。继续,直到达到最佳值。

您只想知道哪些文件相等?还是需要关于差异的详细信息?如果是前者,只需比较文件的SHA1哈希,就可以了。或者如果SHA1太慢,您不需要加密安全性,则检查和。@SvenMarnach,我只需要知道它们是否相等,但可能存在大量相同的大文件,我认为这样做可以避免计算每个文件哈希的开销(并且极不可能发生哈希冲突!)@agf:在我的机器上,计算SHA1的速度至少比从磁盘读取快一百倍,因此这永远不会成为瓶颈。@tjm:计算文件的SHA1的成本与从磁盘读取文件的成本相比是完全可以忽略不计的。SHA1哈希值是160位。您永远不会遇到哈希冲突。
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