这与Python中的分析:谁调用了函数?类似,但有一个小变化。我正在使用cProfile对Python函数进行分析。在第一次运行时,统计数据显示它大部分时间都花在了
接下来,我发现在超过 66,000 次调用 builtins.isinstance() 中花费了大量时间;问题是我找不到源代码来实现堆栈跟踪以找出是谁在调用 isinstance()。(根据我对 Python 的有限了解,我猜想 isinstance 实际上是 C 代码,直接或通过共享对象链接到 Python 解释器中)。无论如何,我找不到谁在调用 isinstance。我尝试了 Profiling in Python: Who called the function? 答案中还发现的 Gprof2dot 方法,但那只显示了 isinstance() 被 is_dtype() 调用,并且调用图在此处停止(在 is_dtype 处)。
有什么想法吗?
datetimes.py
中的get_loc()
上。好吧,我在系统上找到了datetimes.py
文件,并在get_loc()
顶部临时添加了import pdb
和pdb.set_trace()
,然后随机使用调试器命令where
多次,其中夹杂着更多或者更少的continue
。这向我展示了,根据我的随机样本,几乎所有对get_loc()
的数千次调用最终都来自于我的代码中的同一位置。我修改了那段代码以显著减少调用次数。太好了!接下来,我发现在超过 66,000 次调用 builtins.isinstance() 中花费了大量时间;问题是我找不到源代码来实现堆栈跟踪以找出是谁在调用 isinstance()。(根据我对 Python 的有限了解,我猜想 isinstance 实际上是 C 代码,直接或通过共享对象链接到 Python 解释器中)。无论如何,我找不到谁在调用 isinstance。我尝试了 Profiling in Python: Who called the function? 答案中还发现的 Gprof2dot 方法,但那只显示了 isinstance() 被 is_dtype() 调用,并且调用图在此处停止(在 is_dtype 处)。
有什么想法吗?