Я пишу функцию сравнения файлов. Я знаю filecmp.cmp
, но в моем наборе данных ожидается, что многие файлы будут одинаковыми, поэтому я подумал, что вместо того, чтобы сравнивать каждое потенциальное совпадение друг с другом, было бы лучше реализовать многофайловое сравнение, которое может сравнивать их все сразу. (Кроме того, так как я новичок в python, я подумал, что это хорошее упражнение в обучении.) Кажется, это будет хорошо. до сих пор, на самом деле, с некоторыми входами это быстрее, чем Unix cmp
(что на самом деле меня немного беспокоит, потому что я не совсем верю, что это возможно, и поэтому думаю, что, возможно, что-то не так с моей реализацией!)
Итак, у меня написан код, но сейчас я пытаюсь определить, какой будет идеальный размер куска для каждого чтения. Часть меня думает, что все полученные данные нужно будет сравнивать в любом случае, поэтому, чем больше я могу получить в памяти за один раз, тем лучше, но мне интересно, есть ли ограничения структур данных Python, которые могут повлиять на это. Например, я веду, потенциально большие списки чанков, и использую словари, где ключами являются чанки чтения.
Итак, что я должен знать во встроенных структурах данных python, которые могут повлиять на это, или это то, что будет определяться только аппаратными средствами и должно определяться профилированием на конкретной машине?
Читая это в ответ, я понимаю, что это не самый ясный вопрос, но (несмотря на попытки) я не уверен, как это уточнить. Я с удовольствием выложу свой код, если это прояснит ситуацию, но он немного длиннее, чем ваш средний пример кода (хотя и не так уж плохо). Пожалуйста, прокомментируйте, если необходимы дальнейшие разъяснения.
Спасибо.
Обновление Re. SHA1:
Я проверил свой алгоритм против SHA1 только на 2 одинаковых входных файлах (больше ожидаемых в реальных данных), которые выполняются каждые 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
Mine:
real 3m47.185s 4m31.548s 4m40.628s
user 2m47.849s 3m26.207s 3m36.013s
sys 0m59.193s 1m5.139s 1m4.406s