面试题答案
一键面试预分配空间
如果事先知道字典大概需要存储多少个键值对,可以预先分配空间,减少动态扩容带来的开销。
# 预分配空间
my_dict = {None: None} * 100
for i in range(100):
my_dict[i] = i
使用视图对象
字典的视图对象(.keys()
、.values()
、.items()
)在Python 3中返回类似集合的对象,操作这些视图对象比直接操作列表更高效,因为它们是动态的,并且不需要额外的内存来存储所有元素。
my_dict = {'a': 1, 'b': 2, 'c': 3}
keys_view = my_dict.keys()
# 可以直接在视图对象上进行操作,如判断元素是否存在
print('a' in keys_view)
选择合适的键类型
使用不可变且哈希值计算速度快的数据类型作为键,如整数和字符串。避免使用自定义的类实例作为键,除非该类实现了高效的__hash__
和__eq__
方法。
# 使用整数作为键
int_key_dict = {1: 'one', 2: 'two'}
# 使用字符串作为键
str_key_dict = {'name': 'Alice', 'age': 30}
减少字典嵌套
尽量避免过深的字典嵌套,嵌套层次过多会增加查找和修改的时间复杂度。
# 避免复杂嵌套
# 不好的方式
nested_dict = {'person': {'name': 'Bob', 'details': {'age': 25, 'city': 'New York'}}}
# 更好的方式
flat_dict = {'name': 'Bob', 'age': 25, 'city': 'New York'}
缓存字典操作结果
如果在循环中多次对字典进行相同的操作,如获取某个键的值,可以缓存结果。
my_dict = {'data': [1, 2, 3, 4, 5]}
# 缓存字典中列表的长度
length = len(my_dict['data'])
for _ in range(1000):
# 直接使用缓存的长度
if length > 3:
print('List is long enough')