面试题答案
一键面试算法和数据结构优化
- 减少循环嵌套:尽量将多层循环简化为单层循环或减少嵌套层数。例如,如果有一个双重循环用于遍历两个列表并匹配元素,可以使用
zip
函数将两个列表合并后遍历。list1 = [1, 2, 3] list2 = [4, 5, 6] for a, b in zip(list1, list2): # 处理a和b pass
- 选择合适的数据结构:如果需要频繁查找元素,使用
set
或dict
而不是list
。例如,检查一个元素是否在列表中,使用set
的in
操作时间复杂度为O(1),而list
为O(n)。my_set = {1, 2, 3} if 2 in my_set: print('存在')
缓存优化
- 函数结果缓存:对于相同输入会产生相同输出的函数,使用
functools.lru_cache
进行缓存。假设函数expensive_function
依赖数据库查询且输入相同时输出相同。import functools @functools.lru_cache(maxsize=128) def expensive_function(input_param): # 数据库查询等操作 return result
数据库查询优化
- 批量查询:避免多次执行相同的简单查询,将多个查询合并为一个批量查询。例如,使用
IN
语句一次性获取多个数据。假设使用sqlite3
库。import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor() values = [1, 2, 3] placeholders = ', '.join('?' * len(values)) cursor.execute(f'SELECT * FROM your_table WHERE id IN ({placeholders})', values) results = cursor.fetchall()
- 使用索引:在数据库表的常用查询字段上创建索引,以加快查询速度。例如,在
CREATE TABLE
语句中添加索引。CREATE TABLE your_table ( id INTEGER PRIMARY KEY, name TEXT, INDEX idx_name (name) );
并行处理
- 多线程或多进程:如果函数中部分操作是I/O密集型(如数据库查询),可以使用多线程;如果是CPU密集型,使用多进程。例如,使用
concurrent.futures
模块进行多线程处理。import concurrent.futures def process_data(data): # 处理数据 return result data_list = [1, 2, 3, 4, 5] with concurrent.futures.ThreadPoolExecutor() as executor: results = list(executor.map(process_data, data_list))
代码优化
- 减少条件判断嵌套:将复杂的条件判断逻辑进行简化和重构。例如,使用
if - elif - else
结构替代多层嵌套的if
语句。value = 2 if value == 1: result = 'one' elif value == 2: result = 'two' else: result = 'other'
- 避免不必要的计算:在条件判断中,先计算开销小的条件,避免不必要的复杂计算。
a = 10 b = 20 if a < 15 and b > 15: # 执行操作 pass