Обсуждение этого вопроса заставило меня задуматься, поэтому я решил запустить несколько тестов и сравнить время создания 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 помог прояснить ситуацию.