自己写了一个小型项目, 写完发现运行一次要好几秒, 瓶颈在哪呢? 有无优化空间?
涉及到的对象比较多, 方法间的嵌套和递归调用也不少, 很难手工打印时间戳去分析耗时. 此时就需要专业工具啦.
详见参考 [1].
python sdk 内置的库, 可以统计程序各方法的执行频次与耗时, 还能分别展现是否计入子调用(即嵌套调用)的性能指标.
好像感知不到其他线程的运行与性能.
@app.route('/hello', methods=['POST'])
def hello():
request_data_json = json.loads(request.data)
feature_contrib_res_dict = ExplainServiceWrapper.brief_explain(copy.copy(request_data_json),
feature_conf)
http_response = make_response(feature_contrib_res_dict, 200)
return http_response
现在想分析 ExplainServiceWrapper.brief_explain()
的性能, 比起普通方法, 有几处不便:
cProfile.run(app.run)
也无法正常返回解决办法, 使用 werkzeug 工具包提供的 wrapper 类: ProfilerMiddleware. 例子见下:
from werkzeug.middleware.profiler import ProfilerMiddleware
app = Flask(app_name)
app = ProfilerMiddleware(app)
# 其他照旧
"""
PATH: '/hello'
498099 function calls (490270 primitive calls) in 4.344 seconds
Ordered by: internal time, call count
ncalls tottime percall cumtime percall filename:lineno(function)
2 4.057 2.029 4.057 2.029 {method 'recv_into' of '_socket.socket' objects}
2 0.085 0.043 0.085 0.043 {method 'connect' of '_socket.socket' objects}
1095 0.075 0.000 0.075 0.000 {method 'join' of 'str' objects}
2 0.040 0.020 0.062 0.031 D:\ProgrammingFiles\Anaconda3\lib\urllib\parse.py:910()
460304 0.022 0.000 0.022 0.000 {method '__getitem__' of 'dict' objects}
2 0.019 0.009 0.019 0.009 {built-in method _socket.getaddrinfo}
471 0.012 0.000 0.086 0.000 D:\code_work\if_interpretable_model\feature_utils.py:56(indicator_convert)
470 0.007 0.000 0.007 0.000 {built-in method numpy.array}
4 0.005 0.001 0.005 0.001 {method 'sendall' of '_socket.socket' objects}
1 0.002 0.002 4.341 4.341 D:\code_work\if_interpretable_model\if_explainer\_if_brief_explainer.py:28(_explain)
"""
todo