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