python编程符号大全-Python - 【转】命令式编程与符号编程

命令式编程(imperative style programs)

使用编程语句改变程序状态,明确输入变量,并根据程序逻辑逐步运算。

易于理解:在Python里使用命令式编程时,大部分代码编写起来都很直观。

容易调试:可以很方便地进行单步跟踪,获取并分析所有中间变量,或者使用Python的调试工具。

虽然使用命令式编程很方便,但它的运行可能很慢,会存在重复调用函数和长时间保存变量值等问题,耗费内存。

示例:

defsample_add(a, b):return a +bdefsample_fancy_func(a, b, c, d):

e=sample_add(a, b)

f=sample_add(c, d)

g=sample_add(e, f)returngprint(sample_fancy_func(1, 2, 3, 4))

运行结果:10

符号式编程(symbolic style programs)

通常在计算流程完全定义好后才被执行。

更高效:在编译的时候系统容易做更多优化。

更容易移植:符号式编程可以将程序变成一个与Python无关的格式,从而可以使程序在非Python环境下运行,以避开Python解释器的性能问题。

一般来说,符号式编程的程序需要下面3个步骤:

定义计算流程;

把计算流程编译成可执行的程序;

给定输入,调用编译好的程序执行。

由于在编译时系统能够完整地获取整个程序,因此有更多空间优化计算,不仅减少了函数调用,还节省了内存。

深度学习框架TensorFlow和Theano采用了符号式编程的方法。

示例:

defadd_str():"""仅以字符串形式返回计算流程"""

return '''def add(a, b):

return a + b'''

deffancy_func_str():"""仅以字符串形式返回计算流程"""

return '''def fancy_func(a, b, c, d):

e = add(a, b)

f = add(c, d)

g = add(e, f)

return g'''

defevoke_str():"""仅以字符串形式返回计算流程"""

return add_str() + fancy_func_str() + '''print(fancy_func(1, 2, 3, 4))'''prog=evoke_str()print(prog)

x= compile(prog, '', 'exec') #通过compile函数编译完整的计算流程并运行

exec(x)

运行结果:

def add(a, b):

return a + b

def fancy_func(a, b, c, d):

e = add(a, b)

f = add(c, d)

g = add(e, f)

return g

print(fancy_func(1, 2, 3, 4))

10

计算图/符号图(computation graph/symbolic graph)

符号式编程将计算过程抽象为一张计算图(符号图)来描述整个计算过程。

易于描述计算过程,所有输入节点、运算节点、输出节点均符号化处理。

通过建立输入节点到输出节点的传递闭包,从输入节点出发,沿着传递闭包完成数值计算和数据流动,直到达到输出节点。

经过计算图优化,以数据(计算)流方式完成,节省内存空间使用,计算速度快,但不适合程序调试,通常不用于编程语言中。

大多数符号式程序都会显式地或是隐式地包含编译步骤,将计算图转换为能被调用的函数,在代码的最后一行才真正地进行运算。

也就是说,符号式程序清晰地将定义运算图的步骤与编译运算的步骤分割开来。

819128-20190202223435968-1474598376.png

混合式编程

简而言之,命令式编程容易理解和调试,命令语句基本没有优化,按原有逻辑执行。

符号式编程涉及较多的嵌入和优化,不容易理解和调试,但运行速度有同比提升。

有没有可能既得到命令式编程的好处,又享受符号式编程的优势?

开发者们认为,用户应该用纯命令式编程进行开发和调试;

当需要产品级别的计算性能和部署时,用户可以将大部分命令式程序转换成符号式程序来运行。

深度学习框架caffe和mxnet采用了两种编程模式混合的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值