【问题标题】:Measuring various aspects of code衡量代码的各个方面
【发布时间】:2011-12-03 03:20:24
【问题描述】:

是否有工具能够测量项目中函数调用的频率并统计 Python 代码的其他方面(用于统计目的)?

谢谢

【问题讨论】:

  • 哪些方面?最高有效位是否设置在函数编译成的代码对象的第七个字节码指令中?
  • @delnan 这些方面应该与静态代码(不在执行中)、函数调用的频率、函数的平均长度有关。这些对我来说已经足够了,但我可以想象代码可能还有其他各种属性——你很有创意,但我可能不会利用你的建议。
  • 听起来 OP 只需要静态分析代码指标。

标签: python code-analysis code-metrics


【解决方案1】:

Python 分析器应该为您提供相当多的信息:

python -m cProfile -o fooprof myscript.py

您使用简单的脚本加载结果:

#!/usr/bin/env python
import pstats
p = pstats.Stats('fooprof')
p.strip_dirs().sort_stats(-1).print_stats()

或者,如果您不指定 -o fooprof,则结果将打印到标准输出。

请参阅http://docs.python.org/library/profile.html 的文档

我不确定您要计算哪些“其他方面”,但这将决定函数被调用的多少次。如果您对调用的“频率”感兴趣,那么您可以找到作为总执行时间和函数被调用次数的函数的平均频率。例如:

假设foo() 在 10 秒内被调用了 100 次。平均调用频率为 10 次/秒。

【讨论】:

  • 静态源代码(不在执行中)的频率足够了,但我可以在整个项目(目录和所有子目录)上使用它吗?
  • 似乎cProfile options 正在处理正在执行的代码,因为它无法连接到数据库。
【解决方案2】:

我猜你想做静态代码分析。您的代码中有多少个位置 调用一个函数。

这在像 python 这样的动态语言中很难做到,因为有很多 方法可以以其他方式调用函数,而不是通过正确的名称,甚至是 python 字节码编译器 并不总是知道某个地方会调用哪个函数,甚至可能会改变 在执行期间。还有标准的OO多态性。

考虑:

def doublefx(f, x):
    return f(x)*2

print doublefx(math.sqrt, 9)  # 6 

f = stdin.readline()
print doublefx(getattr(math, f), 9)  # ?

任何静态分析工具都无法找出数学中的哪些函数。* 被这段代码调用。即使是第一个例子也很难推理, 第二个是不可能的。

以下工具对复杂性进行了一些静态分析。

PyLint 和 PyChecker 等其他分析工具更侧重于样式和概率 错误。

【讨论】:

  • 其实是文本分析,因为如果在for循环中调用函数我不想数很多次。我只想计算“文本中的函数调用出现次数”。如果没有工具,我将不得不尝试正则表达式,但我认为您展示的特殊情况也应该可以管理。
  • 看来 pymetrics 是我现在能找到的最好的了。我在源代码中看到有一种令牌 FCNNAME,因此我可能能够调整代码并将各种 FCN_NAME 插入字典并计算出现次数。稍后我将不得不详细查看它。谢谢。
【解决方案3】:

我从未使用过它,但看起来cProfile 可能是一个不错的起点。 (请注意,在该页面上提到的三个分析器中,一个(热门)是实验性的并且没有得到很好的支持,一个(配置文件)“为分析程序增加了显着的开销”,最后一个是 cProfile,所以可能会这样做。)页面顶部提供了profile.pypstats.py 的源代码链接。

【讨论】:

  • 谢谢,但我可能不是在寻找分析器,我只对源代码统计信息(而不是执行统计信息)感兴趣
  • 在我看来,cProfile 记录了每个调用函数的名称(除其他外),并且 pstats 有一些方法可以访问此类信息。如果您不想要有关代码实际运行方式和外观的统计信息,请在代码目录中执行 cat * | grep myfunc(.*?) 以获取对 myfunc 的调用的每一行。然后数他们?请注意,此命令仅适用于 Linux。
猜你喜欢
  • 2018-09-09
  • 2012-05-06
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2016-04-21
  • 1970-01-01
相关资源
最近更新 更多