我过去使用过numpy并且对它很熟悉,但有时当我想要一点额外的速度时,我已经能够使用numba.autojit装饰器了 . 简单 . 现在的问题是我正在研究一系列的症状表达式和numba(jit OR autojit)不确定lambdify的功能是什么 . 看来sympy没有维护特定的参数列表 .
我想我可以看看sympy.lamdify是如何工作的,并制作我自己的版本,它包含了numba,但我想我先问一下 .
为了回答你的第二个问题,lambdify的工作方式是它创建一个表达式的字符串形式作为lambda,并使用数字函数创建一个名称空间中的 eval .
eval
例如,对于 lambdify(x, sin(x), 'numpy') , sin(x) 被转换为 'sin(x)' (此处的字符串形式与常规字符串形式相同,但它们可能不同,例如,因为SymPy和NumPy之间的函数名称差异 . 执行此操作的函数是 sympy.printing.lambdarepr.lambdarepr . 请注意,您要使用的功能是 sympy.utilities.lambdify.lambdastr ,这也是下一步 .
lambdify(x, sin(x), 'numpy')
sin(x)
'sin(x)'
sympy.printing.lambdarepr.lambdarepr
sympy.utilities.lambdify.lambdastr
然后将其添加到 lambda ,给出 'lambda x: sin(x)' .
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函数 .
l
换句话说,它在 sin 为 numpy.sin 的命名空间中计算 'lambda x: sin(x)' .
sin
numpy.sin
据我所知,numba.jit和numba.autojit只是翻译字节码,因此它们应该在lambda上正常工作 .
我自己没有使用过numba,但我熟悉lambdify并且可以告诉你它赢得了't work out of the box. So if you are comfortable implementing this yourself a ' numba'模块到lambdify很可能会被赞成"Pull Request"在https://github.com/sympy/sympy
我自己,为我的一个项目实现了类似lambdify的东西,其中默认的sympy太慢,如果有任何帮助你可以在这里查看源代码:https://github.com/bjodah/symvarsub/
2 回答
为了回答你的第二个问题,lambdify的工作方式是它创建一个表达式的字符串形式作为lambda,并使用数字函数创建一个名称空间中的
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)'
.然后,它粗略地做
和
l
将是lambdifies函数 .换句话说,它在
sin
为numpy.sin
的命名空间中计算'lambda x: sin(x)'
.据我所知,numba.jit和numba.autojit只是翻译字节码,因此它们应该在lambda上正常工作 .
我自己没有使用过numba,但我熟悉lambdify并且可以告诉你它赢得了't work out of the box. So if you are comfortable implementing this yourself a ' numba'模块到lambdify很可能会被赞成"Pull Request"在https://github.com/sympy/sympy
我自己,为我的一个项目实现了类似lambdify的东西,其中默认的sympy太慢,如果有任何帮助你可以在这里查看源代码:https://github.com/bjodah/symvarsub/