<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 8.1 命令式和符號式混合編程 本書到目前為止一直都在使用命令式編程,它使用編程語句改變程序狀態。考慮下面這段簡單的命令式程序。 ``` python 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) # 10 ``` 和我們預期的一樣,在運行語句`e = add(a, b)`時,Python會做加法運算并將結果存儲在變量`e`中,從而令程序的狀態發生改變。類似地,后面的兩條語句`f = add(c, d)`和`g = add(e, f)`會依次做加法運算并存儲變量。 雖然使用命令式編程很方便,但它的運行可能很慢。一方面,即使`fancy_func`函數中的`add`是被重復調用的函數,Python也會逐一執行這3條函數調用語句。另一方面,我們需要保存變量`e`和`f`的值直到`fancy_func`中所有語句執行結束。這是因為在執行`e = add(a, b)`和`f = add(c, d)`這2條語句之后我們并不知道變量`e`和`f`是否會被程序的其他部分使用。 與命令式編程不同,符號式編程通常在計算流程完全定義好后才被執行。多個深度學習框架,如**Theano和TensorFlow,都使用了符號式編程**。通常,符號式編程的程序需要下面3個步驟: 1. 定義計算流程; 2. 把計算流程編譯成可執行的程序; 3. 給定輸入,調用編譯好的程序執行。 下面我們用符號式編程重新實現本節開頭給出的命令式編程代碼。 ``` python 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) ``` 輸出: ``` 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 ``` 以上定義的3個函數都僅以字符串的形式返回計算流程。最后,我們通過`compile`函數編譯完整的計算流程并運行。由于在編譯時系統能夠完整地獲取整個程序,因此有更多空間優化計算。例如,編譯的時候可以將程序改寫成`print((1 + 2) + (3 + 4))`,甚至直接改寫成`print(10)`。這樣不僅減少了函數調用,還節省了內存。 對比這兩種編程方式,我們可以看到以下兩點。 * 命令式編程更方便。當我們在Python里使用命令式編程時,大部分代碼編寫起來都很直觀。同時,命令式編程更容易調試。這是因為我們可以很方便地獲取并打印所有的中間變量值,或者使用Python的調試工具。 * 符號式編程更高效并更容易移植。一方面,在編譯的時候系統容易做更多優化;另一方面,符號式編程可以將程序變成一個與Python無關的格式,從而可以使程序在非Python環境下運行,以避開Python解釋器的性能問題。 ## 8.1.1 混合式編程取兩者之長 大部分深度學習框架在命令式編程和符號式編程之間二選一。例如,**Theano和受其啟發的后來者TensorFlow使用了符號式編程,Chainer和它的追隨者PyTorch使用了命令式編程,而Gluon則采用了混合式編程的方式**。 ...... > 由于PyTorch僅僅采用了命令式編程,所以跳過本節剩余部分,感興趣的可以去看[原文](https://zh.d2l.ai/chapter_computational-performance/hybridize.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看