3

我过去使用过 numpy 并且对它相当满意,但有时当我想要一些额外的速度时,我已经能够使用 numba.autojit 装饰器。简单的。现在的问题是我目前正在研究一系列 sympy 表达式,而 numba(jit 或 autojit)不确定如何使用lambdify 中的函数。看起来 sympy 没有维护特定的参数列表。

我想我可以看看 sympy.lamdify 是如何工作的,并制作我自己的包含 numba 的版本,但我想我会先四处询问。

4

2 回答 2

4

要回答您的第二个问题,lambdify 的工作方式是它创建表达式的字符串形式作为 lambda,并将eval其放在具有数值函数的命名空间中。

例如,for lambdify(x, sin(x), 'numpy'),sin(x)被转换为'sin(x)'(这里的字符串形式与常规字符串形式相同,但它们可以不同,例如,因为 SymPy 和 NumPy 之间的函数名称不同。执行此操作的函数是sympy.printing.lambdarepr.lambdarepr。请注意,函数虽然你想使用 is 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函数。

换句话说,它在 is'lambda x: sin(x)'的命名空间中求sinnumpy.sin

据我所知, numba.jit 和 numba.autojit 只是翻译字节码,所以它们应该可以在 lambda 上正常工作。

于 2014-04-07T01:41:18.623 回答
1

我自己没有使用过 numba,但我对 lambdify 很熟悉,可以告诉你它不能开箱即用。因此,如果您愿意自己实现这一点,那么在https://github.com/sympy/sympy上,作为“拉取请求”很可能会非常感谢您自己的“numba”模块来进行lambdify

我自己为我的一个项目实现了类似于lambdify的东西,其中默认的sympy太慢了,如果有任何帮助,你可以在这里查看源代码: https ://github.com/bjodah/symvarsub/

于 2014-04-05T08:58:22.057 回答