命令式編程(imperative style programs)
使用編程語句改變程序狀態,明確輸入變量,並根據程序邏輯逐步運算。
雖然使用命令式編程很方便,但它的運行可能很慢,會存在重複調用函數和長時間保存變量值等問題,耗費內存。
示例:
運行結果:10
符號式編程(symbolic style programs)
通常在計算流程完全定義好後才被執行。
一般來說,符號式編程的程序需要下面3個步驟:
由於在編譯時系統能夠完整地獲取整個程序,因此有更多空間優化計算,不僅減少了函數調用,還節省了內存。 深度學習框架TensorFlow和Theano採用了符號式編程的方法。
示例:
運行結果:
計算圖/符號圖(computation graph/symbolic graph)
符號式編程將計算過程抽象為一張計算圖(符號圖)來描述整個計算過程。
大多數符號式程序都會顯式地或是隱式地包含編譯步驟,將計算圖轉換為能被調用的函數,在代碼的最後一行才真正地進行運算。 也就是說,符號式程序清晰地將定義運算圖的步驟與編譯運算的步驟分割開來。
混合式編程
簡而言之,命令式編程容易理解和調試,命令語句基本沒有優化,按原有邏輯執行。 符號式編程涉及較多的嵌入和優化,不容易理解和調試,但運行速度有同比提升。
有沒有可能既得到命令式編程的好處,又享受符號式編程的優勢? 開發者們認為,用戶應該用純命令式編程進行開發和調試; 當需要產品級別的計算性能和部署時,用戶可以將大部分命令式程序轉換成符號式程序來運行。 深度學習框架caffe和mxnet採用了兩種編程模式混合的方法。