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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 擴展類型(又名.cdef 類) > 原文: [http://docs.cython.org/en/latest/src/tutorial/cdef_classes.html](http://docs.cython.org/en/latest/src/tutorial/cdef_classes.html) 為了支持面向對象的編程,Cython 支持編寫與 Python 完全相同的普通 Python 類: ```py class MathFunction(object): def __init__(self, name, operator): self.name = name self.operator = operator def __call__(self, *operands): return self.operator(*operands) ``` 然而,基于 Python 所謂的“內置類型”,Cython 支持第二種類:_ 擴展類型 _,由于用于聲明的關鍵字,有時也稱為“cdef 類”。與 Python 類相比,它們受到一定限制,但通常比通用 Python 類更高效,速度更快。主要區別在于它們使用 C 結構來存儲它們的字段和方法而不是 Python 字典。這允許他們在他們的字段中存儲任意 C 類型,而不需要 Python 包裝器,并且可以直接在 C 級訪問字段和方法,而無需通過 Python 字典查找。 普通的 Python 類可以從 cdef 類繼承,但不能從其他方面繼承。 Cython 需要知道完整的繼承層次結構,以便布局它們的 C 結構,并將其限制為單繼承。另一方面,普通的 Python 類可以從 Cython 代碼和純 Python 代碼中繼承任意數量的 Python 類和擴展類型。 到目前為止,我們的集成示例并不是非常有用,因為它只集成了一個硬編碼函數。為了解決這個問題,我們將使用 cdef 類來表示浮點數上的函數: ```py cdef class Function: cpdef double evaluate(self, double x) except *: return 0 ``` 指令 cpdef 提供了兩種版本的方法;一個快速使用從 Cython 和一個較慢的使用從 Python。然后: ```py from libc.math cimport sin cdef class Function: cpdef double evaluate(self, double x) except *: return 0 cdef class SinOfSquareFunction(Function): cpdef double evaluate(self, double x) except *: return sin(x ** 2) ``` 這比為 cdef 方法提供 python 包裝稍微多一點:與 cdef 方法不同,cpdef 方法可以被 Python 子類中的方法和實例屬性完全覆蓋。與 cdef 方法相比,它增加了一點調用開銷。 為了使類定義對其他模塊可見,從而允許在實現它們的模塊之外進行有效的 C 級使用和繼承,我們在`sin_of_square.pxd`文件中定義它們: ```py cdef class Function: cpdef double evaluate(self, double x) except * cdef class SinOfSquareFunction(Function): cpdef double evaluate(self, double x) except * ``` 使用它,我們現在可以更改我們的集成示例: ```py from sin_of_square cimport Function, SinOfSquareFunction def integrate(Function f, double a, double b, int N): cdef int i cdef double s, dx if f is None: raise ValueError("f cannot be None") s = 0 dx = (b - a) / N for i in range(N): s += f.evaluate(a + i * dx) return s * dx print(integrate(SinOfSquareFunction(), 0, 1, 10000)) ``` 這幾乎與前面的代碼一樣快,但是由于可以更改集成功能,因此它更加靈活。我們甚至可以傳入 Python 空間中定義的新函數: ```py >>> import integrate >>> class MyPolynomial(integrate.Function): ... def evaluate(self, x): ... return 2*x*x + 3*x - 10 ... >>> integrate(MyPolynomial(), 0, 1, 10000) -7.8335833300000077 ``` 這比原始的僅使用 Python 的集成代碼慢大約 20 倍,但仍然快 10 倍。這顯示了當整個循環從 Python 代碼移動到 Cython 模塊時,加速可以很容易地變大。 關于`evaluate`新實施的一些注意事項: > * 此處的快速方法調度僅起作用,因為`Function`中聲明了`evaluate`。如果在`SinOfSquareFunction`中引入`evaluate`,代碼仍然可以工作,但 Cython 會使用較慢的 Python 方法調度機制。 > * 以同樣的方式,如果參數`f`沒有被輸入,但只是作為 Python 對象傳遞,那么將使用較慢的 Python 調度。 > * 由于參數是打字的,我們需要檢查它是否是`None`。在 Python 中,當查找`evaluate`方法時,這會導致`AttributeError`,但 Cython 會嘗試訪問`None`的(不兼容的)內部結構,就像它是`Function`一樣,導致崩潰或數據損壞。 有一個 _ 編譯器指令 _ `nonecheck`,它會以降低速度為代價啟用此檢查。以下是編譯器指令用于動態打開或關閉`nonecheck`的方法: ```py # cython: nonecheck=True # ^^^ Turns on nonecheck globally import cython cdef class MyClass: pass # Turn off nonecheck locally for the function @cython.nonecheck(False) def func(): cdef MyClass obj = None try: # Turn nonecheck on again for a block with cython.nonecheck(True): print(obj.myfunc()) # Raises exception except AttributeError: pass print(obj.myfunc()) # Hope for a crash! ``` cdef 類中的屬性與常規類中的屬性的行為不同: > * 所有屬性必須在編譯時預先聲明 > * 屬性默認只能從用 Cython 訪問(類型化訪問) > * 屬性可以聲明為暴露的 Python 空間的動態屬性 ```py from sin_of_square cimport Function cdef class WaveFunction(Function): # Not available in Python-space: cdef double offset # Available in Python-space: cdef public double freq # Available in Python-space, but only for reading: cdef readonly double scale # Available in Python-space: @property def period(self): return 1.0 / self.freq @period.setter def period(self, value): self.freq = 1.0 / value ```
                  <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>

                              哎呀哎呀视频在线观看