调试与性能优化
让代码跑得又对又快
调试技巧
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 版本控制基础
继续!