我過去曾經使用過numpy,並且對它很滿意,但有時當我想要一點額外的速度時,我已經能夠使用numba .autojit裝飾器。簡單。現在的問題是我目前正在研究一系列sympy表達式,並且numba(jit或autojit)不確定如何從lambdify中創建函數。它看起來像sympy不維護一個特定的參數列表。在lambdify'd sympy表達式上使用numba.autojit
我想我可以看看sympy.lamdify是如何工作的,並且創建了自己的版本來包裝numba,但我想我會先問一下。
我過去曾經使用過numpy,並且對它很滿意,但有時當我想要一點額外的速度時,我已經能夠使用numba .autojit裝飾器。簡單。現在的問題是我目前正在研究一系列sympy表達式,並且numba(jit或autojit)不確定如何從lambdify中創建函數。它看起來像sympy不維護一個特定的參數列表。在lambdify'd sympy表達式上使用numba.autojit
我想我可以看看sympy.lamdify是如何工作的,並且創建了自己的版本來包裝numba,但我想我會先問一下。
我自己並沒有使用過numba,但是我對lambdify很熟悉,並且可以告訴您它不會開箱即用。所以,如果你是舒適此自己實現一個「numba」模塊lambdify將最可能大加讚賞的在https://github.com/sympy/sympy
我自己,實施了類似的東西lambdify爲我的項目之一「拉入請求」在這裏默認sympy之一是太慢了,如果是的任何幫助,您可以看看源代碼在這裏: https://github.com/bjodah/symvarsub/
要回答你的第二個問題,lambdify的工作方式是,它創造了表達的字符串形式的拉姆達,並且eval
位於具有數字函數的命名空間中。
例如,對於lambdify(x, sin(x), 'numpy')
,sin(x)
轉化爲'sin(x)'
(這裏的字符串形式是一樣的普通字符串的形式,卻可以不同,例如,由於SymPy和NumPy的之間的函數名稱不同。這確實功能這是sympy.printing.lambdarepr.lambdarepr
。需要注意的是要使用,雖然該功能是sympy.utilities.lambdify.lambdastr
,這也確實下一步。
這,然後添加到lambda
,給人'lambda x: sin(x)'
。
然後,大概確實
g = {}
exec 'from numpy import *' in g # or exec('from numpy import *', g) in Python 3
l = eval('lambda x: sin(x)', g)
和l
將是lambdifies函數。
換句話說,它在名稱空間中評估'lambda x: sin(x)'
,其中sin
是numpy.sin
。
據我所知,numba.jit和numba.autojit只是翻譯字節碼,所以他們應該在lambda上正常工作。
你可以舉一個更具體的例子,說明什麼不起作用。我剛剛嘗試過'numba.jit(lambdify(x,sin(x)))(1)',它工作。 – asmeurer