观察函数调用和变量值?

时间:2013-08-16 00:11:37

标签: python tracing

如何在Python脚本中查看调用哪些函数和所有变量值?

我刚刚发现了Python的不确定性包,我想弄清楚它是如何工作的,所以我可以向老板解释一下。

基本上,我看不出实际计算的不确定性。这可能是因为我不知道Python是如何工作的。

对于初学者,如何查看c的计算方式?

import uncertainties
from uncertainties import ufloat

a = ufloat(1,3)
b = ufloat(2,4)

c = a + b  # How does this work??

print c

3 个答案:

答案 0 :(得分:1)

如果您想了解事情的计算方法,pdb确实是一种解决方案。

但是,对于像pdb这样的调试器,很难对所发生的事情进行高级概述。这就是阅读代码也很有用的原因。例如,如果您想知道a+b的作用,可以检查type(a).__add__是否存在,因为如果存在,则会处理添加。不确定性包就是这种情况。

那就是说,__add__确实通过一般机制实现了不确定性而不是专门编码,所以我可以告诉你实现背后的想法,因为这是你最终想要的。

在您的示例中,abVariable个对象:

>>> from uncertainties import ufloat                                            
>>> a = ufloat(1, 3)
>>> b = ufloat(2, 4)
>>> type(a)
<class 'uncertainties.Variable'>

然后c = a + b实际上是ab的线性函数,由a和{{1}的导数表示}}:

b

如果您知道某个函数与其变量的关系,您可以轻松获得approximation of its standard deviation from the standard deviations of its variables

因此,实施uncertainties package背后的主要思想是值为:

  • 随机变量,如x = 3.14±0.0.1和y = 0±0.01(>>> c = a + b >>> type(c) <class 'uncertainties.AffineScalarFunc'> >>> c.derivatives {1.0+/-3.0: 1.0, 2.0+/-4.0: 1.0} 个对象),由标准偏差描述,
  • 或函数的线性近似(Variable对象:“仿射”,因为它们是线性的,“标量”,因为它们的值是真实的,而“func”,因为它们是函数)。

为了得到更复杂的例子,z = 2 * x + sin(y)在(x,y)=(3.14,0)中近似为2 * x + y。在实现中,由于近似是线性的,因此仅存储关于变量的导数:

AffineScalarFunc

不确定性包所做的主要工作是计算涉及变量的任何函数的导数。这是通过automatic differentiation的有效方法完成的。具体来说,当你执行>>> x = ufloat(3.14, 0.01) >>> y = ufloat(0, 0.01) >>> from uncertainties.umath import sin >>> z = 2*x + sin(y) >>> type(z) <class 'uncertainties.AffineScalarFunc'> >>> z.derivatives {3.14+/-0.01: 2.0, 0.0+/-0.01: 1.0} 之类的操作时,Python会自动调用a+b方法,该方法通过计算Variable.__add__()相对于其变量的导数来创建新的线性函数(衍生函数都是一,因为a+b相对于a的导数是1,而a相同。更一般地,一个添加函数,而不是纯变量:b相对于f(a,b) + g(a,b)a的衍生物是使用链规则计算的。这就是自动差异化的工作原理,这就是不确定性包中的实现。这里的关键功能是b。它是整个包中最大和最复杂的功能,但代码主要是注释,details on the method可用。

衍生物然后给出最终函数的标准偏差作为变量标准偏差的函数(uncertainties.wrap()的代码非常简单:更难以自动计算导数)。

答案 1 :(得分:1)

忽略uncertainties模块的特定情况,Python提供sys.settrace函数,可用于实现Smiliey application tracer

之类的功能

例如,来自docs

  

在一个终端窗口中,运行monitor命令:

$ smiley monitor
     

在第二个终端窗口中,使用smiley运行应用程序。这个   示例使用来自smiley源中test_app目录的test.py.   树。

$ smiley run ./test.py
args: ['./test.py']
input = 10
Leaving c() [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Leaving b()
Leaving a()
     

监控会话将显示执行路径和本地变量   对于应用程序。

Starting new run: ./test.py
test.py:   1: import test_funcs
test.py:   1: import test_funcs
test_funcs.py:   1: import sys
test_funcs.py:   1: import sys
test_funcs.py:   3: def gen(m):
test_funcs.py:   8: def c(input):

答案 2 :(得分:0)

您可以查看Python调试器:http://docs.python.org/2/library/pdb.html

您可能知道,调试器旨在让您在执行期间观察程序的各个部分。

您可能还想查看https://github.com/lebigot/uncertainties/

上的Uncertainties包的源代码