前言
前段时间一直在用自己写的遗传算法框架测试算法在优化力场参数的效果,但是跑起来效率很慢,因为适应度函数需要调用多次力场程序计算能量,但是还是比我预想中的慢我也没有及时对程序进行profiling和优化。直到放假前在github有个使用gaft做SVM参数优化的童鞋开了个issue中说道在gaft优化的过程中会大量调用适应度函数,这才使我在国庆放假期间对gaft进行了profiling找到程序瓶颈并针对性的优化。
本文就记录下自己gaft做profiling并优化的过程以及优化的效果。gaft项目链接:
正文
对GAFT进行性能分析(Profiling)
关于如何对Python程序进行性能分析生成分析报告并可视化分析报告,我在之前的一篇博客里《Python优化第一步: 性能分析实践》进行了详细的介绍,这里我就直接分析了。
为了能针对gaft中不同的函数进行分析,借助Python内置的cProfile和pstats模块我写了个装饰器方便分析并生成不同的分析统计文件。
def do_profile(filename, sortby='tottime'):
'''Constructor for function profiling decorator.'''
def _do_profile(func):
'''Function profiling decorator.'''
@wraps(func)
def profiled_func(*args, **kwargs):
'''Decorated function.'''
# Flag for doing profiling or not.
DO_PROF = os.getenv('PROFILING')
if DO_PROF:
profile = cProfile.Profile()
profile.enable()
result = func(*args, **kwargs)
profile.disable()
ps = pstats.Stats(profile).sort_stats(sortby)
ps.dump_stats(filename)
else:
result = func(*args, **kwargs)
return result
return profiled_