命令式和符號式程式設計

2021-10-03 21:10:45 字數 1992 閱讀 2549

命令式程式舉例:

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

fancy_func(1, 2, 3, 4)

輸出:

在執行語句e = add(a, b)時,python會做加法運算並將結果儲存在變數e中,從而令程式的狀態發生改變。類似地,後面的兩條語句f = add(c, d)g = add(e, f)會依次做加法運算並儲存變數。

雖然使用命令式程式設計很方便,但它的執行可能很慢。一方面,python會重複執行呼叫fancy_func函式中的add函式三次,一方面,我們需要儲存變數ef的值直到fancy_func中所有語句執行結束。這是因為在執行e = add(a, b)f = add(c, d)這2條語句之後我們並不知道變數ef是否會被程式的其他部分使用。

與命令式程式設計不同,符號式程式設計通常在計算流程完全定義好後才被執行。通常,符號式程式設計的程式需要下面3個步驟:

定義計算流程;

把計算流程編譯成可執行的程式;

給定輸入,呼叫編譯好的程式執行。

下面我們用符號式程式設計重新實現的上述**塊命令式程式設計**。

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)

y = compile(prog, '', 'exec')

exec(y)

輸出:

觀察輸出我們可以發現:以上定義的3個函式都僅以字串的形式返回計算流程。最後,我們通過compile函式編譯完整的計算流程並執行。由於在編譯時系統能夠完整地獲取整個程式,因此有更多空間優化計算。

下面將上述兩個程式迴圈十萬次,看其速度之間的對比:

上述程式所需時間差別不明顯,但在深度學習的網路中用符號式程式設計(即在較複雜的程式中)符號式程式設計的速度優勢更加明顯:

對比兩種程式設計方式:

當前的深度學習框架:theano和受其啟發的後來者tensorflow使用了符號式程式設計chainer和它的追隨者pytorch使用了命令式程式設計mxnet使用了使用了命令式和符號式的混合程式設計:使用者可用純命令式程式設計進行開發和除錯;當需要產品級別的計算效能和部署時,使用者可以將大部分命令式程式轉換成符號式程式來執行。

宣告式程式設計和命令式程式設計

宣告式程式設計是一種程式設計正規化,它關注的是你要做什麼 what 而不是如何做 how 也就是你只需要告訴 機器 你想要的是什麼 what 讓機器想出如何去做 how 舉例 想要顯示乙個p標籤 this is a textp 查詢學生中年齡大於18對的學生的資訊 select from stude...

函式式程式設計和命令式程式設計

所謂命令式程式設計,是以命令為主的,給機器提供一條又一條的命令序列讓其原封不動的執行。程式執行的效率取決於執行命令的數量。因此才會出現大o表示法等等表示時間空間複雜度的符號。而函式式語言並不是通常意義上理解的 通過函式的變換進行程式設計 注意到純的函式式語言中是沒有變數的 沒有可以改變的東西,所有的...

宣告式程式設計與命令式程式設計

先統一一下概念,我們有兩種程式設計方式 命令式和宣告式。我們可以像下面這樣定義它們之間的不同 命令式程式設計 命令 機器 如何去做事情,告訴它如何去做。宣告式程式設計 告訴 機器 你想要的是什麼,讓機器自己去做。宣告式程式設計和命令式程式設計的 例子 舉個簡單的例子,假設我們想讓乙個陣列裡的數值翻倍...