profiler:我能找到调用我的函数的东西吗?

Posted

技术标签:

【中文标题】profiler:我能找到调用我的函数的东西吗?【英文标题】:profiler: can I find what calls my function? 【发布时间】:2016-09-23 18:49:10 【问题描述】:

我正在开发一种可视化 Python 配置文件跟踪的工具,为此,了解从哪一行调用函数会很有用。

假设我有以下简单的程序:

import time

def my_sleep(x):
  time.sleep(x)

def main():
  my_sleep(1)
  my_sleep(2)

main()

如果我在其上运行 cProfile (python -m cProfile -o a.data a.py),我会得到一个包含以下数据结构的封送文件:

 ('a.py', 3, 'my_sleep'): (2,
                           2,
                           1.4999999999999999e-05,
                           3.00576,
                           ('a.py', 6, 'main'): (2,
                                                  2,
                                                  1.4999999999999999e-05,
                                                  3.00576)),

基本上,这表示my_sleep() 在第 6 行被main() 调用了两次,加起来略多于 3 秒。

有什么方法可以找出它是从哪一行调用的,而不仅仅是什么函数?所以在这种情况下,my_sleep() 在第 7 行被调用 1 秒,在第 8 行被调用 2 秒。

【问题讨论】:

您的输出看起来不像 Python 文档中的示例输出。您是否正在对其进行其他格式设置? docs.python.org/3.3/library/profile.html#instant-user-s-manual 是的,我将其保存为封送文件 (-o a.data) 并将其加载到 python 解释器 (marshal.load(open('a.data'))) 中,然后通过 pprint 进行处理。 您是否尝试过查看控制台上打印的输出,而不保存文件? 有一个名为 line profiler 的工具可能对您有所帮助。 如果你在函数中设置了睡眠,this will do the job 【参考方案1】:

您可以使用sys._getframe(1) 来了解来电者,如下所示:

import sys

def my_sleep():
    print("Line #" + str(sys._getframe(1).f_lineno))
    time.sleep(x)

请记住,通常不鼓励这样做,但如果只是暂时的,我想也可以。

【讨论】:

嗯好的。不过,我正在使用一个大型代码库,我不想在每个函数中都添加一个 print 语句。

以上是关于profiler:我能找到调用我的函数的东西吗?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中有啥东西等于 CodeIgniter 中的 enable_profiler() 吗?

[javac,尝试了所有我能找到的东西后,不识别(不重复)[重复]

minGW可以在win下调用linux库函数吗?默认情况下

调用存储的 MySQL 函数

Python Profiling - 我的代码之外的汇总函数调用

我如何从nodejs重新启动linux