Я пытаюсь оценить, будет ли сравнивать две строки медленнее по мере увеличения их длины. Мои расчеты показывают, что сравнение строк должно принимать амортизированное постоянное время, но мои эксперименты на Python дают странные результаты:
Вот график длины строки (от 1 до 400) по сравнению с временем в миллисекундах. Автоматическая сборка мусора отключена, а gc.collect
выполняется между каждой итерацией.
Я сравниваю 1 миллион случайных строк каждый раз, подсчитывая совпадения следующим образом. Процесс повторяется 50 раз, прежде чем принимать мин всех измеренных времен.
for index in range(COUNT):
if v1[index] == v2[index]:
matches += 1
else:
non_matches += 1
Что может объяснить внезапное увеличение длины 64?
Примечание. Следующий сниппет может использоваться для воспроизведения проблемы, предполагающей, что v1
и v2
- это два списка случайных строк длины n
, а COUNT - их длина.
timeit.timeit("for i in range(COUNT): v1[i] == v2[i]",
"from __main__ import COUNT, v1, v2", number=50)
Обратите внимание на. Я сделал два дополнительных теста: сравнение строки с is
вместо ==
полностью подавляет проблему, а производительность - около 210 мс/1М.
Поскольку упоминание о интернировании было упомянуто, я обязательно добавил пробел после каждой строки, что должно предотвратить интернирование; это ничего не меняет. Это что-то еще, чем интернирование?