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

本文详细介绍了解决Python脚本导致服务器负载过高的问题,通过使用line_profiler定位代码中执行时间较长的部分,为优化代码提供了方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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工具来计时测性能啦。

su -s /bin/sh -c "keystone-manage db_sync" keystone /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.10.2) or chardet (3.0.4) doesn&#39;t match a supported version! RequestsDependencyWarning) Traceback (most recent call last): File "/usr/bin/keystone-manage", line 6, in <module> from keystone.cmd.manage import main File "/usr/lib/python2.7/site-packages/keystone/cmd/manage.py", line 19, in <module> from keystone.cmd import cli File "/usr/lib/python2.7/site-packages/keystone/cmd/cli.py", line 29, in <module> from keystone.cmd import bootstrap File "/usr/lib/python2.7/site-packages/keystone/cmd/bootstrap.py", line 17, in <module> from keystone.common import driver_hints File "/usr/lib/python2.7/site-packages/keystone/common/driver_hints.py", line 18, in <module> from keystone import exception File "/usr/lib/python2.7/site-packages/keystone/exception.py", line 20, in <module> import keystone.conf File "/usr/lib/python2.7/site-packages/keystone/conf/__init__.py", line 20, in <module> from osprofiler import opts as profiler File "/usr/lib/python2.7/site-packages/osprofiler/opts.py", line 18, in <module> from osprofiler import web File "/usr/lib/python2.7/site-packages/osprofiler/web.py", line 20, in <module> from osprofiler import profiler File "/usr/lib/python2.7/site-packages/osprofiler/profiler.py", line 27, in <module> from osprofiler import notifier File "/usr/lib/python2.7/site-packages/osprofiler/notifier.py", line 16, in <module> from osprofiler.drivers import base File "/usr/lib/python2.7/site-packages/osprofiler/drivers/__init__.py", line 4, in <module> from osprofiler.drivers import loginsight # noqa File "/usr/lib/python2.7/site-packages/osprofiler/drivers/loginsight.py", line 25, in <module> import requests File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 94, in <module> from urllib3.exceptions import DependencyWarning ImportError: cannot import name DependencyWarning [root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.10.2) or chardet (3.0.4) doesn&#39;t match a supported version! RequestsDependencyWarning) Traceback (most recent call last): File "/usr/bin/keystone-manage", line 6, in <module> from keystone.cmd.manage import main File "/usr/lib/python2.7/site-packages/keystone/cmd/manage.py", line 19, in <module> from keystone.cmd import cli File "/usr/lib/python2.7/site-packages/keystone/cmd/cli.py", line 29, in <module> from keystone.cmd import bootstrap File "/usr/lib/python2.7/site-packages/keystone/cmd/bootstrap.py", line 17, in <module> from keystone.common import driver_hints File "/usr/lib/python2.7/site-packages/keystone/common/driver_hints.py", line 18, in <module> from keystone import exception File "/usr/lib/python2.7/site-packages/keystone/exception.py", line 20, in <module> import keystone.conf File "/usr/lib/python2.7/site-packages/keystone/conf/__init__.py", line 20, in <module> from osprofiler import opts as profiler File "/usr/lib/python2.7/site-packages/osprofiler/opts.py", line 18, in <module> from osprofiler import web File "/usr/lib/python2.7/site-packages/osprofiler/web.py", line 20, in <module> from osprofiler import profiler File "/usr/lib/python2.7/site-packages/osprofiler/profiler.py", line 27, in <module> from osprofiler import notifier File "/usr/lib/python2.7/site-packages/osprofiler/notifier.py", line 16, in <module> from osprofiler.drivers import base File "/usr/lib/python2.7/site-packages/osprofiler/drivers/__init__.py", line 4, in <module> from osprofiler.drivers import loginsight # noqa File "/usr/lib/python2.7/site-packages/osprofiler/drivers/loginsight.py", line 25, in <module> import requests File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 94, in <module> from urllib3.exceptions import DependencyWarning ImportError: cannot import name DependencyWarning 您在 /var/spool/mail/root 中有邮件 [root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.10.2) or chardet (3.0.4) doesn&#39;t match a supported version! RequestsDependencyWarning) Traceback (most recent call last): File "/usr/bin/keystone-manage", line 6, in <module> from keystone.cmd.manage import main File "/usr/lib/python2.7/site-packages/keystone/cmd/manage.py", line 19, in <module> from keystone.cmd import cli File "/usr/lib/python2.7/site-packages/keystone/cmd/cli.py", line 29, in <module> from keystone.cmd import bootstrap File "/usr/lib/python2.7/site-packages/keystone/cmd/bootstrap.py", line 17, in <module> from keystone.common import driver_hints File "/usr/lib/python2.7/site-packages/keystone/common/driver_hints.py", line 18, in <module> from keystone import exception File "/usr/lib/python2.7/site-packages/keystone/exception.py", line 20, in <module> import keystone.conf File "/usr/lib/python2.7/site-packages/keystone/conf/__init__.py", line 20, in <module> from osprofiler import opts as profiler File "/usr/lib/python2.7/site-packages/osprofiler/opts.py", line 18, in <module> from osprofiler import web File "/usr/lib/python2.7/site-packages/osprofiler/web.py", line 20, in <module> from osprofiler import profiler File "/usr/lib/python2.7/site-packages/osprofiler/profiler.py", line 27, in <module> from osprofiler import notifier File "/usr/lib/python2.7/site-packages/osprofiler/notifier.py", line 16, in <module> from osprofiler.drivers import base File "/usr/lib/python2.7/site-packages/osprofiler/drivers/__init__.py", line 4, in <module> from osprofiler.drivers import loginsight # noqa File "/usr/lib/python2.7/site-packages/osprofiler/drivers/loginsight.py", line 25, in <module> import requests File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 94, in <module> from urllib3.exceptions import DependencyWarning ImportError: cannot import name DependencyWarning
最新发布
06-08
Traceback (most recent call last): File "/group/40156/ruidonghan/one_rec/generative-recommenders/generative_recommenders/dlrm_v3/train/train_ranker.py", line 27, in <module> from generative_recommenders.dlrm_v3.train.utils import ( File "/group/40156/ruidonghan/one_rec/generative-recommenders/generative_recommenders/dlrm_v3/train/utils.py", line 43, in <module> from generative_recommenders.dlrm_v3.utils import get_dataset, MetricsLogger, Profiler File "/group/40156/ruidonghan/one_rec/generative-recommenders/generative_recommenders/dlrm_v3/utils.py", line 39, in <module> from torchrec.metrics.auc import AUCMetricComputation File "/data/miniconda3/envs/openr1/lib/python3.11/site-packages/torchrec/metrics/auc.py", line 15, in <module> from torchmetrics.utilities.distributed import gather_all_tensors File "/data/miniconda3/envs/openr1/lib/python3.11/site-packages/torchmetrics/__init__.py", line 14, in <module> from torchmetrics import functional # noqa: E402 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/data/miniconda3/envs/openr1/lib/python3.11/site-packages/torchmetrics/functional/__init__.py", line 14, in <module> from torchmetrics.functional.audio._deprecated import _permutation_invariant_training as permutation_invariant_training File "/data/miniconda3/envs/openr1/lib/python3.11/site-packages/torchmetrics/functional/audio/__init__.py", line 14, in <module> from torchmetrics.functional.audio.pit import permutation_invariant_training, pit_permutate File "/data/miniconda3/envs/openr1/lib/python3.11/site-packages/torchmetrics/functional/audio/pit.py", line 23, in <module> from torchmetrics.utilities import rank_zero_warn File "/data/miniconda3/envs/openr1/lib/python3.11/site-packages/torchmetrics/utilities/__init__.py", line 14, in <module> from torchmetrics.utilities.checks import check_forward_full_state_property File "/data/miniconda3/envs/openr1/lib/python3.11/site-packages/torchmetrics/utilities/checks.py",
03-21
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值