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