原文链接:https://zh.d2l.ai/chapter_computational-performance/hybridize.html
本文是对原文内容的摘取和扩展。

命令式编程(imperative style programs)

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

  • 易于理解:在Python里使用命令式编程时,大部分代码编写起来都很直观。
  • 容易调试:可以很方便地进行单步跟踪,获取并分析所有中间变量,或者使用Python的调试工具。

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

示例:

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

符号式编程(symbolic style programs)

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

  • 更高效:在编译的时候系统容易做更多优化。
  • 更容易移植:符号式编程可以将程序变成一个与Python无关的格式,从而可以使程序在非Python环境下运行,以避开Python解释器的性能问题。

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

  1. 定义计算流程;
  2. 把计算流程编译成可执行的程序;
  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

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

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

  • 易于描述计算过程,所有输入节点、运算节点、输出节点均符号化处理。
  • 通过建立输入节点到输出节点的传递闭包,从输入节点出发,沿着传递闭包完成数值计算和数据流动,直到达到输出节点。
  • 经过计算图优化,以数据(计算)流方式完成,节省内存空间使用,计算速度快,但不适合程序调试,通常不用于编程语言中。

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

混合式编程

简而言之,命令式编程容易理解和调试,命令语句基本没有优化,按原有逻辑执行。
符号式编程涉及较多的嵌入和优化,不容易理解和调试,但运行速度有同比提升。

有没有可能既得到命令式编程的好处,又享受符号式编程的优势?
开发者们认为,用户应该用纯命令式编程进行开发和调试;
当需要产品级别的计算性能和部署时,用户可以将大部分命令式程序转换成符号式程序来运行。
深度学习框架caffe和mxnet采用了两种编程模式混合的方法。

Python - 命令式编程与符号编程的更多相关文章

  1. [Python] 文科生零基础学编程系列三——数据运算符的基本类别

    上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...

  2. Python第十三章-网络编程

    网络编程 一.网络编程基础 python 的网络编程模块主要支持两种Internet协议: TCP 和 UDP. 1.1通信协议 通信协议也叫网络传输协议或简称为传送协议(Communications ...

  3. 一个Json结构对比的Python小工具兼谈编程求解问题

    先上代码. jsondiff.py #!/usr/bin/python #_*_encoding:utf-8_*_ import argparse import json import sys rel ...

  4. python笔记 - day7-1 之面向对象编程

    python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...

  5. python下的复杂网络编程包networkx的安装及使用

    由于py3.x与工具包的兼容问题,这里采用py2.7 1.python下的复杂网络编程包networkx的使用: http://blog.sina.com.cn/s/blog_720448d30101 ...

  6. Python之路,Day8 - Socket编程进阶

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  7. python邮件SMTP的GUI编程

    写的是python中smtp的gui编程,用的163邮箱给qq邮箱发送邮件做测试,如果你发现你的发送失败,试着用以下方法解决: 1.网页登陆你的邮箱,设置中查看smtp是否开启,比如163邮箱的smt ...

  8. [Python] 文科生零基础学编程系列二——数据类型、变量、常量的基础概念

    上一篇:[Python] 文科生零基础学编程系列--对象.集合.属性.方法的基本定义 下一篇: (仍先以最简单的Excel的VBA为例,语法与Python不同,但概念和逻辑需要理解透彻) p.p1 { ...

  9. Python编程和 Lua编程的比较

    Python编程和 Lua编程的比较 2016.4.21 定义函数: python: def functionname( parameters ): "函数_文档字符串" func ...

随机推荐

  1. C#生成COM组件

    1.类库代码 1.1暴露的方法必须以接口的方式实现 1.2类需要GUID编号 using System; using System.Runtime.InteropServices; //COM组件 n ...

  2. .Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

    背景 之前一直有朋友问,.Net Core + Linux环境有没有类似Windows服务的东西.其实是有的,我了解的方法有两种: #1 创建一个ASP.Net Core的Web项目(如Web API ...

  3. IP地址字符串与int整数之间的无损转化

    今天鹅厂店面,最后问了一个ip地址字符串和整数间无损转化的问题,晚上有时间了手撸了一下代码. public class IPstr { public static void main(String a ...

  4. php 缓存 加速缓存

    PHP四大加速缓存器opcache,apc,xcache,eAccelerator eAccelerator,xcache,opcache,apc(偏数据库缓存,分系统和用户缓存)是PHP缓存扩展, ...

  5. Hive的DDL操作

    DDL:data definittion language 数据定义语言 主要是定义或改变表的结构.数据类型.表之间的链接和约束等初始化操作 DML:data manipulation languag ...

  6. Hadoop的数据压缩

    一.Hadoop的数据压缩 1.概述 在进行MR程序的过程中,在Mapper和Reducer端会发生大量的数据传输和磁盘IO,如果在这个过程中对数据进行压缩处理,可以有效的减少底层存储(HDFS)读写 ...

  7. Py之Crawler:利用python的爬虫功能实现从各种网站上(以百度贴吧为例)获得你喜欢的照片下载到本地电脑上——Jason niu

    import urllib.requestimport re import os def open_url(url): req=urllib.request.Request(url) req.add_ ...

  8. unity下贴图混合(Texture Blending)

    在unity制作自定义时,经常会遇到自定义妆容等问题,美术会提供大量的眉毛/胡子/腮红等贴图,来供用户选择. 美术给出的眉毛的小贴图如下: 在用户选用不同的胡子眉毛,可以将选定的小贴图和皮肤base贴 ...

  9. Codeforces 1153D Serval and Rooted Tree (简单树形DP)

    <题目链接> 题目大意: Serval拥有的有根树有n个节点,节点1是根. Serval会将一些数字写入树的所有节点.但是,有一些限制.除叶子之外的每个节点都有一个写入操作的最大值或最小值 ...

  10. BUAA面向对象设计与构造——第一单元总结

    BUAA面向对象设计与构造——第一单元总结 第一阶段:只支持一元多项式的表达式求导 1. 程序结构 由于是第一次接触面向对象的编程,加之题目要求不算复杂,我在第一次作业中并没有很好利用面向对象的特点, ...