命令式程式舉例:
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
函式三次,一方面,我們需要儲存變數e
和f
的值直到fancy_func
中所有語句執行結束。這是因為在執行e = add(a, b)
和f = add(c, d)
這2條語句之後我們並不知道變數e
和f
是否會被程式的其他部分使用。
與命令式程式設計不同,符號式程式設計通常在計算流程完全定義好後才被執行。通常,符號式程式設計的程式需要下面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表示法等等表示時間空間複雜度的符號。而函式式語言並不是通常意義上理解的 通過函式的變換進行程式設計 注意到純的函式式語言中是沒有變數的 沒有可以改變的東西,所有的...
宣告式程式設計與命令式程式設計
先統一一下概念,我們有兩種程式設計方式 命令式和宣告式。我們可以像下面這樣定義它們之間的不同 命令式程式設計 命令 機器 如何去做事情,告訴它如何去做。宣告式程式設計 告訴 機器 你想要的是什麼,讓機器自己去做。宣告式程式設計和命令式程式設計的 例子 舉個簡單的例子,假設我們想讓乙個陣列裡的數值翻倍...