如何利用sys.callstats?

时间:2018-01-21 20:08:07

标签: python python-3.x anaconda sys

我在PyCharm之后偶然发现了callstats模块中的sys 自动完成建议它。否则我可能永远都不会发现它 因为在docs

中甚至没有提到它

help(sys.callstats)给出了这个:

 Help on built-in function callstats in module sys:
callstats(...)
    callstats() -> tuple of integers

    Return a tuple of function call statistics, if CALL_PROFILE was defined
    when Python was built.  Otherwise, return None.

    When enabled, this function returns detailed, implementation-specific
    details about the number of function calls executed. The return value is
    a 11-tuple where the entries in the tuple are counts of:
    0. all function calls
    1. calls to PyFunction_Type objects
    2. PyFunction calls that do not create an argument tuple
    3. PyFunction calls that do not create an argument tuple
       and bypass PyEval_EvalCodeEx()
    4. PyMethod calls
    5. PyMethod calls on bound methods
    6. PyType calls
    7. PyCFunction calls
    8. generator calls
    9. All other calls
    10. Number of stack pops performed by call_function() 

现在我很好奇为什么它在任何地方都没有被提及,如果有可能在Anaconda版本的Python中使用它。 当我打电话给None时,它会返回sys.callstats(),所以我认为后者的答案是否定的。 但是我仍然有兴趣了解Python构建的实际输出结果如何 这有效。

编辑: 在接下来的评论链接的Issue28799中,我们找到了使用Python 3.7删除callstats的原因。在即将推出的功能实施后,统计数据可能不会正确:

  

我的问题是,通过我在FASTCALL上的工作,在实践中跟踪函数调用的位置变得更加困难。它可能不在Python / ceval.c文件中。我不确定在我的FASTCALL更改后仍然可以正确计算统计数据,而且我不知道如何检查它。

     

Python已经有sys.setprofile(),cProfile和profile模块。还有sys.settrace()。我们还需要CALL_PROFILE吗?

     

附加补丁删除了该功能:

     
      
  • 调用未经测试和未记录的sys.callstats()函数现在会发出DeprecationWarning警告
  •   
  • 删除PyEval_GetCallStats()函数及其文档
  •   

2 个答案:

答案 0 :(得分:2)

我对sys.callstats也感到好奇,所以我用CALL_PROFILE标志编译了Python 2.7.12的二进制文件。使用零用户代码但只有python引导程序,sys.callstats()的结果是:

PCALL_ALL 1691
PCALL_FUNCTION 371
PCALL_FAST_FUNCTION 363
PCALL_FASTER_FUNCTION 257
PCALL_METHOD 59
PCALL_BOUND_METHOD 58
PCALL_CFUNCTION 892
PCALL_TYPE 394
PCALL_GENERATOR 28
PCALL_OTHER 33
PCALL_POP 2005

答案 1 :(得分:1)

别。它没有记录,未经测试,disabled in Python 3.7。如果要进行性能分析,请使用cProfile, profilesys.setprofile

目前,如果您从定义了CALL_PROFILE的源代码编译Python 3.6或2.7,则sys.callstats完全按照文档字符串所说的那样定义CALL_PROFILE:它返回11-元素元组包含各种内部调用类型的计数。统计信息仅在Python/ceval.c中进行跟踪,因此会错过那些不通过的电话。