当前位置:

首页 > 编程开发 > 命令式编程VS符号式编程

命令式编程VS符号式编程

本文目录

    命令式编程逐行执行、易调试但效率较低;符号式编程先构建计算图再编译运行,内存与计算效率更高但调试不便。混合式编程结合两者优势,支持开发时用命令式、部署时转符号式。

    先聊聊一个很有意思的话题:写代码的时候,你是喜欢逐行执行、随时能打印中间结果那种“所见即所得”的感觉,还是更倾向于先把整个计算流程搭好,最后统一“发射”一次?这两种风格,分别对应着命令式编程(imperative style)和符号式编程(symbolic style)。它们在深度学习框架里各有拥趸,也各有长短。下面我们掰开揉碎聊聊。

    什么是 symbolic / imperative style 编程

    用过 Python 或 C++ 的人对命令式编程都不陌生——程序在运行时逐条计算,绝大部分 Python 代码都是这个路子。比如下面这段:

    import numpy as np
    a = np.ones(10)
    b = np.ones(10) * 2
    c = b * a
    d = c + 1
    

    当执行到 c = b * a 时,真正的数值计算立刻就发生了。简单直接。

    符号式编程的玩法就不太一样了。你得先“定义”一个函数——这个定义本身并不做实际计算,而是用占位符描述运算逻辑,等真正给定了输入数据再统一编译执行。上面的例子用符号式重写会是这个样子:

    A = Variable('A')
    B = Variable('B')
    C = B * A
    D = C + Constant(1)
    # compiles the function
    f = compile(D)
    d = f(A=np.ones(10), B=np.ones(10)*2)
    

    看到没?C = B * A 这一句并没有触发数值计算,它只是构建了一张计算图(也叫符号图),描述出“计算链路长什么样”。下图就是 D 对应的计算图:

    这里写图片描述

    大多数符号式程序都会显式或隐式地包含一个编译步骤,把计算图转换成可以调用的函数。上面例子中,真正的数值计算只发生在最后一行。符号式编程的一个核心特征就是:明确把“构建计算图”和“生成可执行代码”分为两个阶段。对于神经网络来说,通常就是用一张计算图来描述整个模型。

    在流行深度学习框架里,Torch、Chainer、Minerva 走的是命令式路线;Theano、CGT、TensorFlow 走的则是符号式路线。CXXNet、Caffe 这类依赖配置文件的框架,其实也可以看作是符号式的——配置文件就是计算图的定义。下面我们来对比一下两边的优劣势。

    命令式编程(imperative style programs)

    命令式编程就是一步步改变程序状态,明确输入变量,按逻辑顺序逐步运算。

    优势在于:好理解——在 Python 里写命令式代码,大部分逻辑都很直观;好调试——可以单步跟踪,随时取到所有中间变量,Python 的调试工具全都能用。

    但代价也很明显:运行可能偏慢,会重复调用函数,长时间保存中间变量值,内存占用也比较高。

    用 Python 调用命令式风格的库非常自然,写法跟普通 Python 代码一样,只是在合适的位置调用库的功能来加速。但如果用 Python 调用符号式风格的库,代码结构就会发生一些变化——比如有些循环可能就很难直接写。试着把下面这个命令式片段转换成符号式看看:

    a = 2
    b = a + 1
    d = np.zeros(10)
    for i in range(d):
        d += np.zeros(10)
    

    如果符号式 API 不支持 for 循环,这个转换就没法直接完成。你不能用写 Python 的思路去调用符号式库,而是需要利用符号 API 定义的领域特定语言(DSL)。深度学习框架通常都会提供功能强大的 DSL,让用户把神经网络转成可调用的计算图。

    说到底,命令式编程更符合人的直觉,用起来更简单——你可以在任何位置打印变量值,可以随便用流程控制和循环。但事情总有两面。

    符号式编程更加有效

    符号式编程(symbolic style programs)

    符号式编程通常在计算流程完全定义好之后才会真正执行。

    优势在于:更高效——编译时系统能拿到整个计算图,有更多空间做优化;更容易移植——符号式程序可以脱离 Python 环境,以避开解释器的性能瓶颈。

    符号式编程一般需要三个步骤:

    • 定义计算流程;
    • 把计算流程编译成可执行程序;
    • 给定输入,调用编译好的程序执行。

    由于编译时系统能“看到”完整程序,所以可以大幅优化计算——不仅减少函数调用,还能节省内存。

    TensorFlow 和 Theano 就是符号式编程的代表。

    既然命令式编程更灵活、更贴近原生语言,为什么那么多深度学习框架要选择符号式?效率是最主要的原因——内存效率和计算效率都更高。我们来看一个具体的例子:

    import numpy as np
    a = np.ones(10)
    b = np.ones(10) * 2
    c = b * a
    d = c + 1
    ...
    

    这里写图片描述

    假设每个数组元素占 8 字节,这段代码在命令式编程下需要多少内存?每一行都要分配空间,一共 4 个数组,每个 10 个元素,总共 4 × 10 × 8 = 320 字节。

    但如果我们事先知道最后只需要 d 这个结果,构建计算图的时候就可以重复利用中间变量的空间。比如用原址计算——把 b 的内存借给 c 用,c 的内存再借给 d 用——这样就能省下一半内存,只需要 2 × 10 × 8 = 160 字节。

    符号式编程的限制更多——因为只需要 d,中间量比如 c 的值就无法访问了。通过原址计算,符号式可以安全复用内存,但牺牲了对中间结果的访问。而命令式编程允许你随时访问任何中间变量——这就是灵活性的代价。

    符号式编程还能通过 算子融合(operation folding) 来优化计算。还是上面那个例子,乘法和加法可以合并成一个操作,如下图所示:

    这里写图片描述

    如果在 GPU 上跑,计算图只需要一个 kernel,省掉了一个 kernel 的开销。很多优化库(比如 Caffe / CXXNet)都会人工编码来做这种融合,从而提升计算效率。

    命令式编程没法自动做算子融合,因为你不知道中间变量以后会不会被访问到。符号式编程能拿到完整的计算图,明确哪些量以后会被访问、哪些不会,所以可以放心地做融合。

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

    符号式编程把计算过程抽象成一张计算图(符号图),用来描述整个计算流程。

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

    大多数符号式程序都会显式或隐式地包含编译步骤,把计算图转换成可调用的函数,在代码的最后一行才真正进行运算。也就是说,符号式程序清晰地把“定义运算图”和“编译运算”这两个步骤分割开来。

    混合式编程

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

    那么问题来了——有没有可能既享受命令式的好处,又能拥有符号式的优势?

    开发者们的思路是:用户先用纯命令式编程进行开发和调试,等到需要产品级别的计算性能和部署时,再把大部分命令式程序转换成符号式程序来运行。深度学习框架 Caffe 和 MXNet 就采用了这种两种模式混合的方法,给足了选择的余地。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    rust下载安装教程详解及Windows环境配置方法
    rust下载安装教程详解及Windows环境配置方法

    详解Windows系统下Rust语言的安装步骤,重点解析rustup工具链管理机制,解决环境变量配置错误及MSVC链接器缺失问题,提供可复制的命令验证方法与常见报错的因果排查思路。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。