首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么pstats.print_callers()忽略限制参数?

为什么pstats.print_callers()忽略限制参数?
EN

Stack Overflow用户
提问于 2019-11-15 17:54:47
回答 1查看 443关注 0票数 2

我试图使用cProfile分析我的python脚本,并使用pstats显示结果。特别是,我试图使用pstats函数p.sort_stats('time').print_callers(20)按时间只打印前20个函数,如文档中所示。

我希望只得到前20名的结果(按时间顺序描述的函数及其调用函数),相反,我得到了一个似乎未经过滤的1000多个函数的列表,这些函数使我的终端完全饱和(因此,我估计超过1000个函数)。

为什么我的限制参数(即20)被print_callers()忽略,我如何解决这个问题?

我试着找了个答案却找不到答案。我试着创建一个最小的可重复的例子,但是当我这样做的时候,我无法重现这个问题(也就是说,它工作得很好)。

我的分析代码是:

代码语言:javascript
复制
import cProfile
import pstats

if __name__ == '__main__':
    cProfile.run('main()', 'mystats')
    p = pstats.Stats('mystats')
    p.sort_stats('time').print_callers(20)

我试图避免发布我的完整代码,所以如果其他人以前遇到过这个问题,并且可以在没有看到我的完整代码的情况下回答,那就太好了。

先谢谢你。

编辑1:部分输出:

代码语言:javascript
复制
  Ordered by: internal time
   List reduced from 1430 to 1 due to restriction <1>

Function                               was called by...
                                           ncalls  tottime  cumtime
{built-in method builtins.isinstance}  <-    2237    0.000    0.000  <frozen importlib._bootstrap>:997(_handle_fromlist)
                                                9    0.000    0.000  <frozen importlib._bootstrap_external>:485(_compile_bytecode)
                                               44    0.000    0.000  <frozen importlib._bootstrap_external>:1117(_get_spec)
                                             4872    0.001    0.001  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\_strptime.py:321(_strptime)
                                                5    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\abc.py:196(__subclasscheck__)
                                               26    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\calendar.py:58(__getitem__)
                                               14    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\calendar.py:77(__getitem__)
                                                2    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\distutils\version.py:331(_cmp)
                                               20    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\enum.py:797(__or__)
                                              362    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\enum.py:803(__and__)
                                                1    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\inspect.py:73(isclass)
                                               30    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\json\encoder.py:182(encode)
                                                2    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\ntpath.py:34(_get_bothseps)
                                                1    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\ntpath.py:75(join)
                                                4    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\ntpath.py:122(splitdrive)
                                                3    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\ntpath.py:309(expanduser)
                                                4    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\os.py:728(check_str)
                                               44    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\re.py:249(escape)
                                                4    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\re.py:286(_compile)
                                              609    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\site-packages\dateutil\parser\_parser.py:62(__init__)
                                             1222    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\_methods.py:48(_count_reduce_items)
                                             1222    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\_methods.py:58(_mean)
                                                1    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\arrayprint.py:834(__init__)
                                             1393    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\fromnumeric.py:1583(ravel)
                                             1239    0.000    0.000  C:\Users\rafael.natan\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\fromnumeric.py:1966(sum)
...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-15 18:58:56

我解决了这个问题。与往常一样,Python没有bug,相反,我误解了函数调用的输出。

我在这里阐述它作为一个答案,以防万一帮助任何人在未来的中消除这一误解。

当我问这个问题时,我不明白为什么p.print_callers(20)打印到终端超过一千行,尽管我把它限制在前20个函数调用(按时间)。

实际上正在发生的是,我对打印前20个“最耗时的函数”的限制,将列表限制在前20个函数上,然后打印一个称为的所有函数的列表,每个函数都是前20个函数的

由于前20个函数中的每个函数被(平均)调用了大约100个不同的函数,因此每个顶级函数都有大约100行与其相关的行。所以20*100=2000和p.print_callers(20)打印的很好,超过了1000行,并且饱和了我的终端。

我希望这能节省一些时间和调试上的麻烦:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58882338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档