Skip to content

调试与性能优化

让代码跑得又对又快


调试技巧

1. Print 调试(最简单)

python
def process_survey(data):
    print(f"Debug: 输入数据类型 {type(data)}, 长度 {len(data)}")

    filtered = [x for x in data if x > 0]
    print(f"Debug: 筛选后 {len(filtered)} 条")

    return sum(filtered) / len(filtered)

2. 使用 assert

python
def calculate_mean(data):
    assert len(data) > 0, "数据不能为空"
    assert all(isinstance(x, (int, float)) for x in data), "必须是数字"

    return sum(data) / len(data)

3. Logging

python
import logging

logging.basicConfig(level=logging.DEBUG)

def process_data(df):
    logging.info(f"开始处理 {len(df)} 行数据")
    df_clean = df.dropna()
    logging.info(f"清洗后 {len(df_clean)} 行")
    return df_clean

性能优化

1. 使用向量化

python
import numpy as np
import time

#  慢:循环
start = time.time()
result = [x ** 2 for x in range(1000000)]
print(f"循环: {time.time() - start:.4f}秒")

#  快:向量化
start = time.time()
arr = np.arange(1000000)
result = arr ** 2
print(f"NumPy: {time.time() - start:.4f}秒")

2. 使用生成器

python
#  占内存
squares = [x**2 for x in range(1000000)]

#  节省内存
squares = (x**2 for x in range(1000000))

3. 缓存结果

python
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

性能分析

使用 %timeit(Jupyter)

python
%timeit sum([x**2 for x in range(1000)])

使用 cProfile

python
import cProfile

cProfile.run('your_function()')

常见性能问题

1. 避免重复计算

python
#  慢
for i in range(len(df)):
    if df.iloc[i]['income'] > df['income'].mean():  # 每次都算mean
        print(i)

#  快
mean_income = df['income'].mean()  # 只算一次
for i in range(len(df)):
    if df.iloc[i]['income'] > mean_income:
        print(i)

2. 使用内置函数

python
#  慢
total = 0
for x in numbers:
    total += x

#  快
total = sum(numbers)

实用检查清单

代码质量

  • [ ] 变量命名清晰
  • [ ] 函数有文档
  • [ ] 异常处理完善
  • [ ] 代码格式规范

性能

  • [ ] 使用向量化
  • [ ] 避免重复计算
  • [ ] 使用合适的数据结构

最后一节

下一节:Git 版本控制基础

继续!

基于 MIT 许可证发布。内容版权归作者所有。