Ответ 1
Форма функции вызывает конструктор во время выполнения, чтобы вернуть новый экземпляр, тогда как буквальная форма заставляет компилятор "создать" его (действительно, чтобы выпустить байт-код, который приводит к новому объекту) во время компиляции. Первый может быть полезен, если (по какой-то причине) классы были локально отскочены к разным типам.
>>> def f():
... []
... list()
... {}
... dict()
...
>>> dis.dis(f)
2 0 BUILD_LIST 0
3 POP_TOP
3 4 LOAD_GLOBAL 0 (list)
7 CALL_FUNCTION 0
10 POP_TOP
4 11 BUILD_MAP 0
14 POP_TOP
5 15 LOAD_GLOBAL 1 (dict)
18 CALL_FUNCTION 0
21 POP_TOP
22 LOAD_CONST 0 (None)
25 RETURN_VALUE