优化原则
不要过早优化。先确保代码正确,再分析性能瓶颈,有针对性地进行优化。 优化后要进行充分的测试,确保功能不变。在可读性和性能之间找到平衡。
Python量化编程速查
| 技巧 | 说明 | 性能提升 |
|---|---|---|
| 使用NumPy向量化 | 避免循环,使用数组运算 | 10-100x |
| Pandas内置函数 | 使用apply/transform代替循环 | 5-20x |
| 布尔索引 | 使用mask代替if判断 | 2-5x |
| groupby聚合 | 高效分组计算 | 3-10x |
| 技巧 | 说明 | 效果 |
|---|---|---|
| 使用适当的数据类型 | float32代替float64,category代替string | 节省50%+内存 |
| 删除不需要的列 | 及时drop无用数据 | 减少内存占用 |
| 分块处理 | 使用chunksize读取大文件 | 避免内存溢出 |
| 稀疏矩阵 | 处理稀疏数据 | 大幅节省内存 |
| 及时释放变量 | 使用del和gc.collect() | 优化内存使用 |
| 工具 | 适用场景 | 使用方法 |
|---|---|---|
multiprocessing |
CPU密集型任务 | ProcessPoolExecutor |
concurrent.futures |
简单并行任务 | ThreadPoolExecutor |
joblib |
机器学习并行 | Parallel(n_jobs=-1) |
ray |
分布式计算 | @ray.remote |
Dask |
大数据处理 | dask.delayed |
| 工具 | 说明 | 性能提升 |
|---|---|---|
Numba |
JIT编译Python代码 | 10-100x |
Cython |
编译为C扩展 | 50-200x |
PyPy |
JIT Python解释器 | 2-5x |
C/C++扩展 |
编写原生扩展 | 100-1000x |
| 技巧 | 说明 | 效果 |
|---|---|---|
| 批量插入 | 使用executemany代替循环插入 | 10-50x |
| 索引优化 | 为常用查询字段创建索引 | 5-100x |
| 分区表 | 按时间/类型分区 | 提升查询效率 |
| 连接池 | 重用数据库连接 | 减少连接开销 |
| 时序数据库 | 使用InfluxDB/TimescaleDB | 大幅提升性能 |
| 技巧 | 说明 | 效果 |
|---|---|---|
| 避免重复计算 | 缓存中间结果 | 减少计算量 |
| 使用高效数据结构 | set代替list查找 | O(n)到O(1) |
| 提前过滤数据 | 减少处理的数据量 | 提升整体效率 |
| 使用生成器 | 节省内存 | 减少内存占用 |
| 算法复杂度优化 | 选择最优算法 | 大幅提升性能 |
| 工具 | 用途 | 特点 |
|---|---|---|
cProfile |
代码性能分析 | 内置,详细 |
line_profiler |
逐行性能分析 | 精确到行 |
memory_profiler |
内存使用分析 | 内存追踪 |
py-spy |
实时性能监控 | 无侵入 |
snakeviz |
可视化分析 | 图形界面 |
不要过早优化。先确保代码正确,再分析性能瓶颈,有针对性地进行优化。 优化后要进行充分的测试,确保功能不变。在可读性和性能之间找到平衡。