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,尝试了所有我能找到的东西后,不识别(不重复)[重复]