背景

自己写了一个小型项目, 写完发现运行一次要好几秒, 瓶颈在哪呢? 有无优化空间?
涉及到的对象比较多, 方法间的嵌套和递归调用也不少, 很难手工打印时间戳去分析耗时. 此时就需要专业工具啦.

cProfile

详见参考 [1].
python sdk 内置的库, 可以统计程序各方法的执行频次耗时, 还能分别展现是否计入子调用(即嵌套调用)的性能指标.

多线程

好像感知不到其他线程的运行与性能.

普通方法

web应用内的方法

@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() 的性能, 比起普通方法, 有几处不便:

  1. 方法的入参来自 web请求, 本地 mock 方法实参不方便.
  2. cProfile.run(‘ExplainServiceWrapper.brief_explain’) 无法传参, 也无法得到返回值.
  3. server_app 线程是永久运行的, 即便 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 secondsOrdered by: internal time, call countncalls  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(<listcomp>)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)
"""

参考

  1. python 官方 profile 文档

python profile 性能分析相关推荐

  1. python脚本性能分析

    在进行python开发时需要对python脚本的性能分析,以便对python脚本进行优化,下面使用cProfile和 pstats对python脚本性能分析. cProfile思路 1.使用cProf ...

  2. python代码性能分析_Python 性能分析入门指南

    虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题: ...

  3. 教你3个python「性能分析」工具,再也不用自己计算函数耗时了

    文章目录 引言 1. cProfile:最便捷的性能分析 保存性能数据 查看性能数据 查看耗时最多的子函数 查看特定名称函数的耗时 2. timeit:计算小代码片段的耗时 3. IDE中的性能分析 ...

  4. Chrome DevTools:在 Profile 性能分析中显示原生 javascript 函数

    本文翻译自 Chrome DevTools: Show native functions in JS Profile,中文版首发在我的知乎专栏 V8 源码及周边. 在 Chrome DevTools ...

  5. python 函数性能分析

    1 使用profile分析函数性能 示例1, 以profile为例: import profile def profileTest(): Total =1; for i in range(10): T ...

  6. python代码性能分析_使用memory_profiler对代码进行性能分析会增加执行时间

    我正在编写一个简单的应用程序,它将大文本文件拆分为较小的文件,并且我已经编写了2个版本,一个使用列表,另一个使用生成器.我使用memory_profiler模块对这两个版本进行了概要分析,并清楚地显示 ...

  7. 【python】性能分析工具汇总

    在进行程序设计时经常需要对程序各部分内存与时间开销进行分析,以便找出瓶颈提高效率.本文总结了常用的几个性能分析工具,包括内存分析工具memory_profiler ,运算时间分析工具line_prof ...

  8. Python算法性能分析-时间复杂度

    时间复杂度: 算法的运行时间. 什么是大O: 大O用来表示上界的. 数据规模: 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模 ...

  9. python性能分析工具模块_python——关于Python Profilers性能分析器

    1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和ps ...

最新文章

  1. 用初次训练的SVM+HOG分类器在负样本原图上检测HardExample
  2. 「Tensorflow」TensorFlow基本使用步骤——以线性回归为练习
  3. GET_ROLE_BASED_PAGE_USAGES
  4. JDBC(九)DatabaseMetaData 数据库元数据
  5. oracle的标准写法,oracle 表连接特有写法与标准写法
  6. SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载)
  7. 一个简洁的个人导航页面源码
  8. NVisionXR_iOS教程五 —— 添加灯光渲染
  9. Android版本下载以及切换
  10. Maven中央仓库地址和Nexus 下载地址
  11. ArcGIS和Fragstats的脚本化调用 ------以ArcPy和命令行的方式
  12. TS:声明合并de妙处
  13. Linux 系统结构详解
  14. Deep Match to Rank Model for Personalized Click-Through Rate Prediction
  15. excel熵值法计算权重_SPSS主成分分析 | 权重计算amp;极差法标准化超详细教程!(下)...
  16. 什么是 PCIe 卡?您需要了解的有关PCI Express卡的所有信息
  17. linux io apic,linux-kernel – IO-APIC级别与PCI-MSI-X之间的差异
  18. FileReader 文件操作
  19. async 函数的含义和用法
  20. Kaggle word2vec NLP 教程 第二部分:词向量

热门文章

  1. brpc源码学习(六)- brpc server 端整体流程
  2. 两个傻子的爱情,看后非常感动:QQ情感日志
  3. 扎好篱笆桩:三大运营商守住网络安全“命门”
  4. P12-Windows与网络基础-Windows组管理
  5. Gunicorn 部署flask-socketio项目,项目访问慢的问题
  6. Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?
  7. Must use destructuring props assignmenteslint
  8. 常用Hadoop命令
  9. 神武4 电脑版天魔里职业玩法攻略(原创)
  10. 项目支付接入支付宝【沙箱环境】