<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 1.4。使用`@jit` 編譯 Python 代碼 > 原文: [http://numba.pydata.org/numba-doc/latest/user/jit.html](http://numba.pydata.org/numba-doc/latest/user/jit.html) Numba 為代碼生成提供了幾個實用程序,但它的核心功能是 [`numba.jit()`](../reference/jit-compilation.html#numba.jit "numba.jit") 裝飾器。使用這個裝飾器,您可以通過 Numba 的 JIT 編譯器標記一個函數進行優化。各種調用模式會觸發不同的編譯選項和行為。 ## 1.4.1。基本用法 ### 1.4.1.1。懶惰編譯 使用`@jit`裝飾器的推薦方法是讓 Numba 決定何時以及如何優化: ```py from numba import jit @jit def f(x, y): # A somewhat trivial example return x + y ``` 在此模式下,編譯將推遲到第一個函數執行。 Numba 將在調用時推斷參數類型,并根據此信息生成優化代碼。 Numba 還可以根據輸入類型編譯單獨的特化。例如,使用整數或復數調用上面的`f()`函數將生成不同的代碼路徑: ```py >>> f(1, 2) 3 >>> f(1j, 2) (2+1j) ``` ### 1.4.1.2。急切的編譯 您還可以告訴 Numba 您期望的功能簽名。函數`f()`現在看起來像: ```py from numba import jit, int32 @jit(int32(int32, int32)) def f(x, y): # A somewhat trivial example return x + y ``` `int32(int32, int32)`是函數的簽名。在這種情況下,相應的特化將由`@jit`裝飾器編譯,并且不允許其他專門化。如果您希望對編譯器選擇的類型進行細粒度控制(例如,使用單精度浮點數),這將非常有用。 如果省略返回類型,例如通過寫`(int32, int32)`而不是`int32(int32, int32)`,Numba 將嘗試為您推斷它。函數簽名也可以是字符串,您可以將其中的幾個作為列表傳遞;有關詳細信息,請參閱 [`numba.jit()`](../reference/jit-compilation.html#numba.jit "numba.jit") 文檔。 當然,編譯的函數給出了預期的結果: ```py >>> f(1,2) 3 ``` 如果我們將`int32`指定為返回類型,則高位位被丟棄: ```py >>> f(2**31, 2**31 + 1) 1 ``` ## 1.4.2。調用和內聯其他功能 Numba 編譯的函數可以調用其他編譯函數。函數調用甚至可以在本機代碼中內聯,具體取決于優化器啟發式。例如: ```py @jit def square(x): return x ** 2 @jit def hypot(x, y): return math.sqrt(square(x) + square(y)) ``` `@jit`裝飾器 _ 必須將 _ 添加到任何此類庫函數中,否則 Numba 可能會生成更慢的代碼。 ## 1.4.3。簽名規格 顯式`@jit`簽名可以使用多種類型。以下是一些常見的: * `void`是沒有返回任何內容的函數的返回類型(從 Python 調用時實際返回`None`) * `intp`和`uintp`是指針大小的整數(分別是有符號和無符號) * `intc`和`uintc`相當于 C `int`和`unsigned int`整數類型 * `int8`,`uint8`,`int16`,`uint16`,`int32`,`uint32`,`int64`,`uint64`是相應位寬的有限寬度整數(有符號和無符號) * `float32`和`float64`分別是單精度和雙精度浮點數 * `complex64`和`complex128`分別是單精度和雙精度復數 * 數組類型可以通過索引任何數字類型來指定,例如一維單精度數組的`float32[:]`或 8 位整數的二維數組的`int8[:,:]`。 ## 1.4.4。編譯選項 可以將許多僅關鍵字參數傳遞給`@jit`裝飾器。 ### 1.4.4.1。 `nopython` Numba 有兩種編譯模式: [nopython 模式](../glossary.html#term-nopython-mode)和[對象模式](../glossary.html#term-object-mode)。前者產生更快的代碼,但有一些限制可以迫使 Numba 回到后者。為防止 Numba 退回,而是引發錯誤,請傳遞`nopython=True`。 ```py @jit(nopython=True) def f(x, y): return x + y ``` 也可以看看 [故障排除和提示](troubleshoot.html#numba-troubleshooting) ### 1.4.4.2。 `nogil` 每當 Numba 將 Python 代碼優化為僅適用于本機類型和變量(而不是 Python 對象)的本機代碼時,就不再需要持有 Python 的[全局解釋器鎖](https://docs.python.org/3/glossary.html#term-global-interpreter-lock "(in Python v3.7)")(GIL)。如果您通過`nogil=True`,Numba 將在輸入此類編譯函數時釋放 GIL。 ```py @jit(nogil=True) def f(x, y): return x + y ``` 使用 GIL 發布的代碼與執行 Python 或 Numba 代碼的其他線程(相同的編譯函數或其他代碼)同時運行,允許您利用多核系統。如果在[對象模式](../glossary.html#term-object-mode)中編譯該功能,則無法進行此操作。 使用`nogil=True`時,您必須警惕多線程編程的常見缺陷(一致性,同步,競爭條件等)。 ### 1.4.4.3。 `cache` 為了避免每次調用 Python 程序時的編譯時間,可以指示 Numba 將函數編譯的結果寫入基于文件的緩存中。這是通過傳遞`cache=True`來完成的: ```py @jit(cache=True) def f(x, y): return x + y ``` ### 1.4.4.4。 `parallel` 為已知具有并行語義的函數中的那些操作啟用自動并行化(和相關優化)。有關支持的操作列表,請參閱[使用@jit](parallel.html#numba-parallel) 自動并行化。通過`parallel=True`啟用此功能,必須與`nopython=True`一起使用: ```py @jit(nopython=True, parallel=True) def f(x, y): return x + y ``` 也可以看看 [使用@jit](parallel.html#numba-parallel) 自動并行化
                  <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>

                              哎呀哎呀视频在线观看