面试题答案
一键面试利用变量缓存机制优化
在Python中,对于一些常见的小整数(通常是 -5 到 256 之间)和短字符串,Python会缓存这些对象,使得相同值的对象在内存中只有一份。对于大型列表嵌套字典的数据结构,可以利用这一特性,提前创建并复用这些小整数和短字符串对象。
代码示例
import sys
# 原始数据结构生成
large_data_structure = []
for _ in range(1000):
sub_dict = {
'key1': 'a_short_string',
'key2': 10,
'key3': 'another_short_string'
}
large_data_structure.append(sub_dict)
# 优化数据结构生成,复用缓存对象
cached_key1 = 'a_short_string'
cached_key2 = 10
cached_key3 = 'another_short_string'
optimized_data_structure = []
for _ in range(1000):
sub_dict = {
cached_key1: cached_key1,
cached_key2: cached_key2,
cached_key3: cached_key3
}
optimized_data_structure.append(sub_dict)
# 计算内存占用函数
def get_memory_usage(data):
return sys.getsizeof(data)
# 计算原始数据结构内存占用
original_memory_usage = get_memory_usage(large_data_structure)
print(f"原始数据结构内存占用: {original_memory_usage} 字节")
# 计算优化后数据结构内存占用
optimized_memory_usage = get_memory_usage(optimized_data_structure)
print(f"优化后数据结构内存占用: {optimized_memory_usage} 字节")
优化前后内存占用对比分析方法
- 使用
sys.getsizeof()
函数:sys.getsizeof()
函数可以返回对象占用的内存大小(以字节为单位)。通过对优化前后的数据结构分别调用此函数,可以得到它们各自的内存占用。 - 对比结果:在上述代码中,
original_memory_usage
和optimized_memory_usage
分别存储了原始数据结构和优化后数据结构的内存占用。通过比较这两个值,可以直观地看出优化带来的内存节省效果。
在实际场景中,由于Python的缓存机制是自动的,对于短字符串和小整数,重复使用相同值对象会直接利用缓存,减少内存开销。上述示例通过显式复用缓存对象,在大型数据结构中进一步强调了这一优化效果。但需要注意,sys.getsizeof()
函数返回的是对象本身的内存占用,不包括对象引用的其他对象的内存占用,对于复杂嵌套结构,可能需要递归计算所有子对象的内存占用才能得到更准确的结果。