如何查看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
Tags:
您可以看看Python调试器:http://docs.python.org/2/library/pdb.html
如您所知,调试器的设计目的是让您在执行过程中监视程序的各个部分的移动。在
您可能还想查看一下位于https://github.com/lebigot/uncertainties/的不确定性包的源代码
忽略} 函数,该函数可用于实现Smiliey application tracer
uncertainties
模块的特定情况,Python提供了^{例如,从docs:
如果你想知道事物是如何计算的,
pdb
确实是一种解决方案。在但是,使用像
pdb
这样的调试器,很难从较高的层次了解正在发生的事情。这就是为什么阅读代码也是有用的。例如,如果您想知道a+b
做什么,可以检查type(a).__add__
是否存在,因为如果存在,它将处理加法。不确定性一揽子计划就是这样。在也就是说,
__add__
确实是通过一个通用的机制实现的,而不是专门为其编码的,所以我可以告诉你它实现背后的想法,因为这正是你最终要寻找的。在在您的示例中,}是
a
和{Variable
对象:那么}的一个线性函数,由其关于}的导数表示:
^{pr2}$c = a + b
实际上是a
和{a
和{如果你知道一个函数相对于它的变量的导数,你很容易得到一个approximation of its standard deviation from the standard deviations of its variables。在
因此,uncertainties package实现背后的主要思想是,值是:
Variable
对象),用它们的标准差来描述AffineScalarFunc
对象:“仿射”是因为它们是线性的,“标量”是因为它们的值是实的,“func”是因为它们是函数)。在举一个更复杂的例子,z=2*x+sin(y)在(x,y)=(3.14,0)中近似为2*x+y。在实现中,由于近似是线性的,因此只存储关于变量的导数:
因此,不确定性软件包的主要工作是计算任何涉及变量的函数的导数。这是通过automatic differentiation的有效方法实现的。具体地说,当您执行类似}相对于{}的导数是一个,而{}的导数也是一个)。更一般地说,添加函数,而不是纯变量:}和{}的导数是用链式规则计算的。这就是自动微分的工作原理,这也是不确定性包中实现的。这里的关键函数是
a+b
的操作时,Python会自动调用Variable.__add__()
方法,该方法通过计算a+b
相对于其变量的导数来创建一个新的线性函数(导数都是一个,因为{f(a,b) + g(a,b)
相对于{uncertainties.wrap()
。它是整个包中最大、最复杂的函数,但是代码大部分是注释的,并且details on the method是可用的。在导数然后给出最终函数的标准差,作为变量标准差的函数(代码
AffineScalarFunc.std_dev()
非常简单:更困难的任务是自动计算导数)。在相关问题 更多 >
编程相关推荐