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

时间:2011-11-01 20:42:37

标签: python performance optimization data-structures python-3.x

我正在编写文件比较功能。我知道filecmp.cmp但是在我的数据集中,预计很多文件都是相同的,所以我想而不是将每个潜在的匹配相互比较,最好实现多文件比较,一次比较它们。 (另外,因为我是python的新手,所以我认为这是一个很好的学习练习。)它似乎正在进行O.K.到目前为止,实际上有一些输入它比unix的cmp更快(实际上让我有点担心,因为我不太相信这是可能的,因此认为我的实现可能有问题!)

所以,我编写了代码,但我现在正在尝试确定每次读取的理想块大小。我的一部分认为所检索的数据都必须进行比较,因此,我一次进入内存的越多越好,但我想知道是否存在可能影响上述内容的python数据结构的局限性。例如,我正在维护可能很大的块列表并使用字典,其中键是读取块。

那么,我应该在python内置数据结构中注意哪些可能会影响这一点,或者这只是由硬件决定的,应该通过在特定机器上进行性能分析来确定?


读回来我意识到这不是最明确的问题,但是(尽管有尝试)我不知道如何澄清它。我很高兴发布我的代码,如果这将使事情更清楚,但它比你的平均代码样本(虽然不是太糟糕)有点长。如果需要进一步澄清,请评论。

感谢。


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

(在任一测试期间,计算机都没有任何其他负载,尽管我在评论中说过,这不是在目标机器上运行,但是它运行在具有相当合理规格的机器上。测试有可能在两个线程中运行;即SHA1发生在两个线程中,并且为我的两个线程启动但是由于实现,只有一个线程被使用。单线程SHA1版本需要更长时间。两个测试都读取一次大小相同的块。给出了三组结果。)

现在我很困惑。评论(重新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

1 个答案:

答案 0 :(得分:3)

我建议您使用binary search方法来选择尺寸值。

从一个较大的值(一个你知道太大的值)开始并减少一半。如果它更快,再将它减半。如果速度较慢,请转到下一半间隔。继续,直到达到最佳值。