我一直在用Cython玩弄最近和應用裝飾的用Cython功能如何裝飾適用於用Cython cpdef功能
Cdef functions/classes cannot take arbitrary decorators
在這裏,當我遇到這個錯誤是來了,我擺弄的代碼搭配:
import functools
def memoize(f):
computed = {}
@functools.wraps(f)
def memoized_f(main_arg, *args, **kwargs):
if computed.get(main_arg):
return computed[main_arg]
computed[main_arg] = f(main_arg, *args, **kwargs)
return computed[main_arg]
return memoized_f
@memoize
cpdef int fib(int n):
return 1 if n < 2 else fib(n - 1) + fib(n - 2)
錯誤提示CDEF功能只能採取一定裝飾。是否有可能編寫自己的裝飾器,你可以應用到cdef函數?
編輯:對於未來的讀者:
在@提到DavidW的回答排序作品的g = plus_one(_g)
把戲。它不適用於遞歸。例如在我的示例代碼中執行fib = memoize(fib)
並不記憶遞歸調用fib,儘管它會記憶頂級調用。即主叫fib(5)
將memoize的所述fib(5)
調用的結果,但它會不 memoize的遞歸調用(即fib(4), fib(3), fib(2), fib(1)
)
作爲@DavidW指出的,cdef, cpdef
功能完全在編譯時決定的;裝飾是一個運行時的東西,並不會更新實際的功能。
只是對我的訣竅的快速評論:請注意,我使用了不同的名稱。如果你命名'cdef'函數'_fib',做了'fib = memorize(_fib)',並確保你遞歸調用'fib'(不是'_fib'),我認爲它可以工作,但是你會添加很多每次調用時Python的開銷。 – DavidW