MST

星途 面试题库

面试题:Python自定义函数的性能调优与装饰器应用

假设有一个复杂的Python自定义函数,该函数执行时间较长,包含多个循环和条件判断。请从性能调优的角度出发,使用装饰器对其进行优化,比如添加缓存功能,记录函数执行时间等,并说明每一步优化的原理以及在不同应用场景下的适用性。
34.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 添加缓存功能(使用functools.lru_cache装饰器)

    • 代码示例
    import functools
    
    
    @functools.lru_cache(maxsize=128)
    def long_running_custom_function(*args, **kwargs):
        # 这里是复杂的函数逻辑,包含多个循环和条件判断
        result = 0
        for i in range(10000):
            for j in range(10000):
                if i % 2 == 0 and j % 2!= 0:
                    result += i + j
        return result
    
    • 原理functools.lru_cache装饰器会为函数创建一个缓存,当相同的参数再次调用函数时,它会直接从缓存中返回结果,而不是重新执行函数。这大大节省了计算资源和时间,尤其是对于那些计算成本高且相同输入会经常出现的函数。
    • 适用性:适用于函数输入参数相对固定,且函数执行结果不会因外部状态变化而改变的场景。例如,计算数学公式、解析固定格式的数据等。如果函数的输入参数依赖于实时变化的数据,如当前时间、随机数等,使用lru_cache可能会导致结果不准确。
  2. 记录函数执行时间

    • 代码示例
    import time
    
    
    def log_execution_time(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            result = func(*args, **kwargs)
            end_time = time.time()
            print(f"Function {func.__name__} took {end_time - start_time} seconds to execute.")
            return result
        return wrapper
    
    
    @log_execution_time
    def long_running_custom_function(*args, **kwargs):
        # 这里是复杂的函数逻辑,包含多个循环和条件判断
        result = 0
        for i in range(10000):
            for j in range(10000):
                if i % 2 == 0 and j % 2!= 0:
                    result += i + j
        return result
    
    • 原理:通过在函数执行前后记录时间戳,并计算两者的差值,从而得到函数的执行时间。这有助于发现性能瓶颈,了解哪些函数占用了较多的时间,以便针对性地进行优化。
    • 适用性:适用于任何想要了解函数性能状况的场景。无论是优化单个函数还是分析整个程序的性能,记录函数执行时间都是一个重要的手段。它可以帮助开发者确定哪些函数需要重点优化,以及评估优化措施是否有效。