面试题答案
一键面试字典数据结构特点优化
- 使用合适的键:
- 字典是基于哈希表实现的,键的选择对性能影响很大。应选择不可变且哈希值计算快速的对象作为键。例如,对于用户记录,可以使用用户ID(假设为整数或字符串)作为键,而不是使用包含多个属性的复杂对象。
- 示例代码:
# 以用户ID作为键存储用户记录 users = {} user_id = 1 user_info = {'name': 'Alice', 'address': '123 Street', 'phone': '123 - 456 - 7890'} users[user_id] = user_info
- 预分配空间:
- 虽然Python的字典会动态扩展,但如果能提前预估数据量,可以使用
dict.fromkeys()
方法预分配一定数量的槽位,减少动态扩展带来的性能开销。不过,要注意预分配过多空间可能会浪费内存。 - 示例代码:
estimated_user_count = 10000 users = dict.fromkeys(range(estimated_user_count)) for i in range(estimated_user_count): user_info = {'name': f'User_{i}', 'address': f'Address_{i}', 'phone': f'Phone_{i}'} users[i] = user_info
- 虽然Python的字典会动态扩展,但如果能提前预估数据量,可以使用
内存管理优化
- 使用更紧凑的数据结构:
- 对于存储大量类似对象,可以考虑使用
collections.namedtuple
或dataclass
来代替字典存储每个对象的属性。namedtuple
是不可变的,占用内存比字典少;dataclass
相对灵活且在Python 3.7+ 也有较好的内存优化。 - 示例代码:
from collections import namedtuple User = namedtuple('User', ['name', 'address', 'phone']) users = {} user_id = 1 user = User('Bob', '456 Avenue', '456 - 789 - 0123') users[user_id] = user
from dataclasses import dataclass @dataclass class User: name: str address: str phone: str users = {} user_id = 2 user = User('Charlie', '789 Road', '789 - 012 - 3456') users[user_id] = user
- 对于存储大量类似对象,可以考虑使用
- 内存释放与垃圾回收:
- 及时删除不再使用的字典项,Python的垃圾回收机制会自动回收内存。例如,如果删除某个用户记录,可以使用
del
关键字。 - 示例代码:
users = {1: {'name': 'Alice', 'address': '123 Street', 'phone': '123 - 456 - 7890'}} del users[1]
- 及时删除不再使用的字典项,Python的垃圾回收机制会自动回收内存。例如,如果删除某个用户记录,可以使用
其他优化措施
- 缓存查询结果:
- 如果某些查询是重复的,可以缓存查询结果。例如,如果经常查询某个用户的地址,可以在首次查询后缓存结果。
- 示例代码:
cache = {} def get_user_address(user_id, users): if user_id not in cache: cache[user_id] = users[user_id]['address'] return cache[user_id]