python3.6使用line-profiler踩坑记录

0.背景

       前两天在服务器上使用top指令后看到load average到达了11.96, 12.78, 13.58,对于8核的机器来说这个load有些偏高了,之前load一般保持在5左右。于是,在top中按C查看进程详情,发现有一个脚本开了多进程,并且每个进程的CPU使用率都极高,初步断定就是这个脚本导致了服务器load飙升。随后检查了该脚本的代码,肉眼未能发现不妥之处,于是就需要用到本文要介绍的神器,line-profiler。

1.安装

       查看PyPI后,直接pip3 install line_profiler,果不其然,每次接触新事物的第一步都是报错,如下:

    #include "Python.h"
                        ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1

百度报错信息,有人说需要安装cython,但检查发现服务器上已经安装了gcc,所以估计安装cython并不能解决问题。装好cython后再次安装line-profiler,依旧报同样的错,果然和猜测的一样,cython解决不了我们的问题,继续百度。
       仔细查看报错信息,发现问题出在#include “Python.h”,那么安装一个对应的devel环境或可解决。

yum install python-devel

不对,这好像是python2的,我用的是python3.6,NG…

yum install python36-devel

除了python-devel之外,还有一些可能用到的包,一并安装

yum install -y libffi-devel python36-devel openssl-devel

安装完依赖后继续尝试安装line-profiler,Duang~依旧报错T.T…之后不知道在哪里看到的,把python36-devel换成了python36u-devel后,才成功安装了line_profiler。前后折腾了大概两个小时,终于可以使用line_profiler了。

2.使用

       line_profiler的使用非常简单,在需要测试的函数前加上@profile装饰器,并且不需要import任何包,如下面的demo所示:

@profile
def set_md5(char_val):
    """
    md5加密
    :param char_val: 需要加密的字符
    :return:
    """
    if not isinstance(char_val, bytes):
        char_val = char_val.encode("utf-8")
    m = hashlib.md5()
    m.update(char_val)
    return m.hexdigest()

把整段代码放在test.py文件中,在代码所在位置kernprof -l -v test.py等待执行完毕。执行完毕后屏幕上看到如下输出:

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     6                                           @profile
     7                                           def set_md5(char_val):
     8                                               """
     9                                               md5加密
    10                                               :param char_val: 需要加密的字符
    11                                               :return:
    12                                               """
    13         1          7.0      7.0     13.0      if not isinstance(char_val, bytes):
    14         1          2.0      2.0      3.7          char_val = char_val.encode("utf-8")
    15         1          8.0      8.0     14.8      m = hashlib.md5()
    16         1         16.0     16.0     29.6      m.update(char_val)
    17         1         21.0     21.0     38.9      return m.hexdigest()

输出结果中,Hits和Time比较高的那几行代码,就是优化空间最大的地方,是最需要关注的代码。

3.说完了

       在分析python性能这块,line_profiler主要关注的是执行时间,除此之外,还有分析内存性能的memory_profiler,和能够分析内存泄漏的objgraph,都是很实用很有意思的工具,未来找机会试用一下。看完本文,相信你以后不会再傻傻的使用time工具来计时测性能啦。

在PyCharm中安装line_profiler,可以按照以下步骤进行操作: 1. 打开PyCharm并进入你的项目。 2. 点击顶部菜单栏中的"File"。 3. 选择"Settings"。 4. 在设置窗口中,展开"Project"选项。 5. 选择"Project Interpreter"。 6. 在右侧的依赖项列表中,点击"+"按钮。 7. 在搜索框中输入"line_profiler"。 8. 在搜索结果中选择"line_profiler"并点击"Install Package"按钮。 9. 等待安装完成。 这样,你就成功在PyCharm中安装了line_profiler。现在,你可以在代码中使用line_profiler来进行性能分析了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python性能分析工具Line_profiler](https://blog.csdn.net/weixin_44613728/article/details/120411325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [python性能分析line_profiler模块-耗时,效率 时间](https://blog.csdn.net/kyle1314608/article/details/103123187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值