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

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

我正在编写一个文件比较函数。我知道 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/

相关文章:

python - wx.Gauge在Windows中无法更新超过25%,在Linux中有效

python - 如何创建动态数组

performance - MongoDB Ubuntu 安装需要几个小时

Python--从一个非空的multiprocessing.Queue中获取Queue.Empty异常

C++ substr,优化速度

python - normalize-space 只适用于 xpath 而不是 css 选择器

Python:参数列表中的 Lambda

python - 在Python中查找数组中不交叉的对并迭代删除,直到没有剩余对

optimization - 安装 Homebrew、libjpeg 和 optipng 以使用 HTML5 Boilerplate 构建工具

javascript - 如何更好地检查 JavaScript 中的参数对象?