首页 文章

在lambdify'd sympy表达式上使用numba.autojit

提问于
浏览
3

我过去使用过numpy并且对它很熟悉,但有时当我想要一点额外的速度时,我已经能够使用numba.autojit装饰器了 . 简单 . 现在的问题是我正在研究一系列的症状表达式和numba(jit OR autojit)不确定lambdify的功能是什么 . 看来sympy没有维护特定的参数列表 .

我想我可以看看sympy.lamdify是如何工作的,并制作我自己的版本,它包含了numba,但我想我先问一下 .

2 回答

  • 3

    为了回答你的第二个问题,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)' .

    然后,它粗略地做

    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函数 .

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

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

  • 1

    我自己没有使用过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/

相关问题