2014-04-01 59 views
2

我過去曾經使用過numpy,並且對它很滿意,但有時當我想要一點額外的速度時,我已經能夠使用numba .autojit裝飾器。簡單。現在的問題是我目前正在研究一系列sympy表達式,並且numba(jit或autojit)不確定如何從lambdify中創建函數。它看起來像sympy不維護一個特定的參數列表。在lambdify'd sympy表達式上使用numba.autojit

我想我可以看看sympy.lamdify是如何工作的,並且創建了自己的版本來包裝numba,但我想我會先問一下。

+0

你可以舉一個更具體的例子,說明什麼不起作用。我剛剛嘗試過'numba.jit(lambdify(x,sin(x)))(1)',它工作。 – asmeurer

回答

1

我自己並沒有使用過numba,但是我對lambdify很熟悉,並且可以告訴您它不會開箱即用。所以,如果你是舒適此自己實現一個「numba」模塊lambdify將最可能大加讚賞的在https://github.com/sympy/sympy

我自己,實施了類似的東西lambdify爲我的項目之一「拉入請求」在這裏默認sympy之一是太慢了,如果是的任何幫助,您可以看看源代碼在這裏: https://github.com/bjodah/symvarsub/

2

要回答你的第二個問題,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)',其中sinnumpy.sin

據我所知,numba.jit和numba.autojit只​​是翻譯字節碼,所以他們應該在lambda上正常工作。