标签:返回 targe 提升 inf turn 因此 数据 完全 pytho
原文链接:https://zh.d2l.ai/chapter_computational-performance/hybridize.html
本文是对原文内容的摘取和扩展。
使用编程语句改变程序状态,明确输入变量,并根据程序逻辑逐步运算。
虽然使用命令式编程很方便,但它的运行可能很慢,会存在重复调用函数和长时间保存变量值等问题,耗费内存。
示例:
def sample_add(a, b): return a + b def sample_fancy_func(a, b, c, d): e = sample_add(a, b) f = sample_add(c, d) g = sample_add(e, f) return g print(sample_fancy_func(1, 2, 3, 4))
运行结果:10
通常在计算流程完全定义好后才被执行。
一般来说,符号式编程的程序需要下面3个步骤:
由于在编译时系统能够完整地获取整个程序,因此有更多空间优化计算,不仅减少了函数调用,还节省了内存。
深度学习框架TensorFlow和Theano采用了符号式编程的方法。
示例:
def add_str(): """仅以字符串形式返回计算流程""" return ‘‘‘ def add(a, b): return a + b ‘‘‘ def fancy_func_str(): """仅以字符串形式返回计算流程""" return ‘‘‘ def fancy_func(a, b, c, d): e = add(a, b) f = add(c, d) g = add(e, f) return g ‘‘‘ def evoke_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
符号式编程将计算过程抽象为一张计算图(符号图)来描述整个计算过程。
大多数符号式程序都会显式地或是隐式地包含编译步骤,将计算图转换为能被调用的函数,在代码的最后一行才真正地进行运算。
也就是说,符号式程序清晰地将定义运算图的步骤与编译运算的步骤分割开来。
简而言之,命令式编程容易理解和调试,命令语句基本没有优化,按原有逻辑执行。
符号式编程涉及较多的嵌入和优化,不容易理解和调试,但运行速度有同比提升。
有没有可能既得到命令式编程的好处,又享受符号式编程的优势?
开发者们认为,用户应该用纯命令式编程进行开发和调试;
当需要产品级别的计算性能和部署时,用户可以将大部分命令式程序转换成符号式程序来运行。
深度学习框架caffe和mxnet采用了两种编程模式混合的方法。
标签:返回 targe 提升 inf turn 因此 数据 完全 pytho
原文地址:https://www.cnblogs.com/anliven/p/10349356.html