为什么pprofile没有输出?

时间:2016-06-15 13:55:34

标签: python facebook

我是python的新手,我想使用pprofile,但我不能让它运行。例如

#pprofile --threads 0 test.py

给我错误

bash: pprofile: Command not found.

我尝试将pprofiler作为模块运行,如下所述:https://github.com/vpelletier/pprofile,使用以下脚本:

#!/usr/bin/env sc_python3
# coding=utf-8

import time
import pprofile

def someHotSpotCallable():
    profiler = pprofile.Profile()
    with profiler:
        time.sleep(2)
        time.sleep(1)
    profiler.print_stats()

运行此脚本不提供输出。以下列方式更改脚本

#!/usr/bin/env sc_python3
# coding=utf-8

import time
import pprofile

def someHotSpotCallable():
    profiler = pprofile.Profile()
    with profiler:
        time.sleep(2)
        time.sleep(1)
    profiler.print_stats()

print(someHotSpotCallable())

给出输出

Total duration: 3.00326s
None

如何获得https://github.com/vpelletier/pprofile上显示的逐行表格输出?

我使用Python 3.4.3,版本2.7.3在我的系统上提供相同的输出(仅总持续时间)。

我必须安装任何东西吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

pprofile作者在这里。

要将pprofile用作命令,您必须安装它。我到目前为止唯一的工作包是via pypi。除非您使用依赖项收集工具(如buildout),否则最简单的可能是设置virtualenv并在其中安装pprofile:

flag

除此之外,没有别的东西可以安装:pprofile只依赖于python解释器功能(下面有更多内容)。 然后你可以运行它:

$path_to_your_virtualenv/bin/pip install pprofile

运行pprofile的另一种方法是获取源代码并将其作为python脚本运行,而不是作为独立的命令运行:

$path_to_your_virtualenv/bin/pprofile <args>

然后,关于令人惊讶的输出:我注意到你的shebang提到“sc_python3”作为翻译。这个python解释器的实现是什么?你会在解释器启动时加载一些非标准模块吗?

pprofile,在确定性模式下,依赖于解释器在每次换行时触发special events,每次调用函数或每次返回时,并且,为了完整性,它还监视何时创建线程因为跟踪功能是本地线程。看起来解释器不会触发这些事件。可能的解释是,其他东西正在与pprofile竞争这些事件:一次只能注册一个函数。例如,代码覆盖率工具和调试器可以使用此功能(或标准sys模块中的另一个密切相关的功能,setprofile)。仅仅为了完整性,setprofile对于pprofile是不够的,因为它只触发函数调用/返回时的事件。

您可能想要以牺牲准确性为代价来尝试pprofile的统计分析模式(但是为了极大地减少分析器开销),尽管pprofile必须依赖另一个解释器功能:列出{{3}的能力可悲的是,与sys标准标准的其他功能相比,它的可移植性更低。

所有这些在call stack of all running threadsCPython 2.xCPython 3.x和(已经提供,但我没有亲自测试过)pypy