Python中创建列表/集合/字典的两种写法:性能差异与规范偏好疑问
Python中列表、集合、字典初始化方式的差异解析
Great question! Let's break this down clearly, covering performance, style guidelines, and the analogous cases for sets and dicts.
1. 列表:[] vs list()
性能差异
毫无疑问,new_list = []的执行速度要比new_list = list()更快。原因很简单:
[]是列表字面量,Python解释器可以直接识别并创建列表对象,不需要额外的函数调用开销。list()是调用内置构造函数,涉及到函数查找、参数传递(哪怕是空参数)等额外步骤,这些都会增加微小但可测量的耗时。
用timeit工具测试的话(举个直观的例子):
import timeit print(timeit.timeit('[]', number=10**7)) # 通常在0.1-0.2秒左右 print(timeit.timeit('list()', number=10**7)) # 通常在0.3-0.4秒左右
差距是很明显的,尤其是在大规模循环或者频繁初始化列表的场景下。
规范与偏好
这不仅仅是团队偏好——PEP 8(Python官方风格指南)明确推荐使用字面量[]来初始化空列表,而非list()。原因包括代码更简洁、可读性更高,同时性能更优。当然,如果你需要将其他可迭代对象转换为列表(比如list(range(10))),那list()是必要的,但空列表初始化优先用[]。
2. 字典:{} vs dict()
情况和列表几乎完全一致:
- 性能上,
new_dict = {}比new_dict = dict()更快,同样因为字面量的直接创建方式避免了函数调用开销。 - PEP 8也推荐用
{}初始化空字典,除非你需要用关键字参数创建字典(比如dict(a=1, b=2)),这种场景下dict()写法更简洁。
3. 集合:特殊情况
集合的情况略有不同,因为空集合不能用{}来初始化——{}实际上创建的是空字典!所以空集合只能用set(),这是没得选的。
但对于非空集合:
{1, 2, 3}这种集合字面量比set([1, 2, 3])性能更好,因为后者需要先创建一个列表,再将其转换为集合,多了一步开销。- PEP 8推荐用集合字面量初始化非空集合,空集合则必须用
set()。
总结
- 性能层面:字面量初始化(
[]、{}、{1,2,3})比构造函数调用(list()、dict()、set([...]))更快,因为避免了函数调用的额外开销。 - 规范层面:PEP 8明确推荐字面量优先(除了空集合只能用
set()),这是官方认可的最佳实践,而非单纯的团队偏好。 - 特殊情况:空集合只能用
set(),因为{}是字典的字面量。
内容的提问来源于stack exchange,提问作者DavidDG
相关产品推荐
相关产品推荐

