Обсуждение этого вопроса заставило меня задуматься, поэтому я решил запустить несколько тестов и сравнить время создания set((x,y,z))
с {x,y,z}
для создания наборов в Python (I '). используя Python 3.7).
Я сравнил два метода, используя time
и timeit
. Оба соответствовали * следующим результатам:
test1 = """
my_set1 = set((1, 2, 3))
"""
print(timeit(test1))
Результат: 0.30240735499999993
test2 = """
my_set2 = {1,2,3}
"""
print(timeit(test2))
Результат: 0.10771795900000003
Таким образом, второй метод был почти в 3 раза быстрее, чем первый. Это было довольно неожиданное различие для меня. Что происходит внутри, чтобы таким образом оптимизировать производительность литерала набора над методом set()
? Что было бы целесообразно для каких случаев?
* Примечание: я показываю только результаты тестов timeit
так как они усредняются по многим образцам и, следовательно, возможно, более надежны, но результаты при тестировании со time
показали схожие различия в обоих случаях.
Редактировать: я знаю об этом похожем вопросе, и хотя он отвечает на некоторые аспекты моего первоначального вопроса, он не охватил все это. Множества не были рассмотрены в этом вопросе, и поскольку пустые множества не имеют буквального синтаксиса в python, мне было любопытно, как (если вообще) создание множеств с использованием литерала будет отличаться от использования метода set()
. Кроме того, мне было интересно, как происходит обработка параметра tuple в set((x,y,z)
за кулисами и как это может повлиять на время выполнения. Отличный ответ от coldspeed помог прояснить ситуацию.