MST

星途 面试题库

面试题:Python错误排查与优化(高级难度)

给定如下Python代码: ```python import time def calculate_average(lst): total = 0 for num in lst: total += num return total / len(lst) start_time = time.time() large_list = list(range(1, 1000001)) average = calculate_average(large_list) end_time = time.time() print(f"Average: {average}, Time taken: {end_time - start_time} seconds") ``` 1. 假设在运行过程中,偶尔会出现 `ZeroDivisionError` 错误,分析可能的原因并给出解决方案。 2. 如何优化 `calculate_average` 函数,以提高其性能,特别是在处理大型列表时。
48.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 分析可能原因
    • lst 为空列表时,执行 len(lst) 会得到 0,此时 total / len(lst) 就会引发 ZeroDivisionError 错误。 解决方案: 在计算平均值之前,添加对列表是否为空的检查。修改后的代码如下:
import time

def calculate_average(lst):
    if not lst:
        return None
    total = 0
    for num in lst:
        total += num
    return total / len(lst)

start_time = time.time()
large_list = list(range(1, 1000001))
average = calculate_average(large_list)
if average is not None:
    end_time = time.time()
    print(f"Average: {average}, Time taken: {end_time - start_time} seconds")
else:
    print("The list is empty.")
  1. 性能优化方案
    • 使用 sum 函数:Python 内置的 sum 函数是用 C 实现的,比显式的 for 循环在性能上更优。
    • 减少除法运算的次数:可以避免每次循环都计算 len(lst)。优化后的代码如下:
import time

def calculate_average(lst):
    if not lst:
        return None
    length = len(lst)
    total = sum(lst)
    return total / length

start_time = time.time()
large_list = list(range(1, 1000001))
average = calculate_average(large_list)
if average is not None:
    end_time = time.time()
    print(f"Average: {average}, Time taken: {end_time - start_time} seconds")
else:
    print("The list is empty.")