По той же причине []
быстрее, чем list()
; Интерпретатор включает выделенную поддержку операций на основе синтаксиса, которые используют специализированные пути кода, в то время как вызовы конструктора включают:
- Загрузка конструктора из встроенной области (требуется пара
dict
поисков, один в глобальной области, затем другой во встроенной области при сбое)
- Требуется диспетчеризация через универсальные механизмы вызываемой диспетчеризации и универсальный код синтаксического анализа аргументов, и все это намного дороже, чем однобайтовый код, который считывает все свои аргументы из стека в виде массива C
Все эти преимущества относятся к фиксированным накладным расходам; big-O обоих подходов одинаковы, поэтому {*range(10000)}
не будет заметно / надежно быстрее, чем set(range(10000))
, потому что фактические строительные работы значительно превышают накладные расходы по загрузке и вызову конструктора через общую диспетчеризацию.