MST

星途 面试题库

面试题:Python函数调用性能优化之复杂场景

假设你有一个Python函数,它需要频繁调用并处理大量数据,函数内部包含多个循环和条件判断,同时依赖外部资源(如数据库查询)。请阐述你会从哪些方面进行性能优化,并给出具体的优化策略及代码示例。
10.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

算法和数据结构优化

  1. 减少循环嵌套:尽量将多层循环简化为单层循环或减少嵌套层数。例如,如果有一个双重循环用于遍历两个列表并匹配元素,可以使用zip函数将两个列表合并后遍历。
    list1 = [1, 2, 3]
    list2 = [4, 5, 6]
    for a, b in zip(list1, list2):
        # 处理a和b
        pass
    
  2. 选择合适的数据结构:如果需要频繁查找元素,使用setdict而不是list。例如,检查一个元素是否在列表中,使用setin操作时间复杂度为O(1),而list为O(n)。
    my_set = {1, 2, 3}
    if 2 in my_set:
        print('存在')
    

缓存优化

  1. 函数结果缓存:对于相同输入会产生相同输出的函数,使用functools.lru_cache进行缓存。假设函数expensive_function依赖数据库查询且输入相同时输出相同。
    import functools
    
    @functools.lru_cache(maxsize=128)
    def expensive_function(input_param):
        # 数据库查询等操作
        return result
    

数据库查询优化

  1. 批量查询:避免多次执行相同的简单查询,将多个查询合并为一个批量查询。例如,使用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()
    
  2. 使用索引:在数据库表的常用查询字段上创建索引,以加快查询速度。例如,在CREATE TABLE语句中添加索引。
    CREATE TABLE your_table (
        id INTEGER PRIMARY KEY,
        name TEXT,
        INDEX idx_name (name)
    );
    

并行处理

  1. 多线程或多进程:如果函数中部分操作是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))
    

代码优化

  1. 减少条件判断嵌套:将复杂的条件判断逻辑进行简化和重构。例如,使用if - elif - else结构替代多层嵌套的if语句。
    value = 2
    if value == 1:
        result = 'one'
    elif value == 2:
        result = 'two'
    else:
        result = 'other'
    
  2. 避免不必要的计算:在条件判断中,先计算开销小的条件,避免不必要的复杂计算。
    a = 10
    b = 20
    if a < 15 and b > 15:
        # 执行操作
        pass