gpt4 book ai didi

python - 对用户输入字符串使用 numba.jit

转载 作者:行者123 更新时间:2023-11-30 22:13:59 26 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序将用户输入函数作为字符串接收,并使用该函数进行大量计算。这些计算是使用 numba.jit 完成的,如果我对函数进行硬编码,代码就可以工作,但我无法弄清楚如何解析字符串,以便可以将其转换为 nopython=True 的 jitted 函数。

例如,我的代码使用函数运行

@jit(nopython=True)
def f(x):
return x*x

但我想采用用户输入字符串“x*x”并创建相同的函数。我尝试过使用 SymPy,但无法让它与 jit 很好地配合。有什么想法吗?

最佳答案

假设您实际上想要将任意 Python 代码作为用户输入并运行它——您通常真的非常不想这样做,但我们假设您有充分的理由......

但首先:您提到尝试使用 SymPy 来做到这一点。如果您实际上尝试从 SymPy 表达式创建函数,例如,通过使用 sympify 或 lambdify 应该可以工作,如果不行,您需要如果您需要调试帮助,请向我们展示您的代码。

但是,让我们停止拖延,看看如何才能完成您所要求的事情,即使这很可能不是您真正想要的。

<小时/>

请记住,装饰器只是函数,它接受一个函数并返回另一个函数,您可以正常调用它们。因此,您所要做的就是将任意 Python 代码转换为函数,然后将其传递给装饰器。

<小时/>

如果任意 Python 代码只是一个表达式,您可以将其包装在 lambda 表达式中,eval 结果,然后您就得到了一个应用该表达式的函数表达式:

lambdastr = f'lambda x: {user_string}'
lambdafunc = eval(lambdastr)
numbafunc = numba.jit(nopython=True)(lambdafunc)

或者,如果您愿意的话:

numbafunc = numba.jit(nopython=True)(eval(f'lambda x: {user_string}'))

如果您在想“但是等等,eval 很危险”——嗯,是的,eval 很危险,因为它将任意用户字符串评估为代码,这正是你想做什么。没有不危险的方法可以做到这一点。

因此,如果您的用户向您传递字符串 x * x,您现在就得到了一个对其输入进行平方的函数,如果用户向您传递字符串 __import__('os ').system('rm -rf/'),您现在已经有了一个尝试删除整个硬盘驱动器的函数。

<小时/>

如果您想获取一条语句,可以通过将其包装在 def 中并调用 exec 来有效地执行相同的操作:

defstr = f'def __(x): {user_string}'
deffunc = exec(defstr)
numbafunc = numba.jit(nopython=True)(deffunc)
<小时/>

如果任意 Python 代码可以是语句 block ,那么由于需要处理缩进,情况会稍微复杂一些,但这并不太难:

user_lines = '\n'.join(' '+line for line in user_string.splitlines())
defstr = f'def __(x):\n{user_lines}'
deffunc = exec(defstr)
numbafunc = numba.jit(nopython=True)(deffunc)

关于python - 对用户输入字符串使用 numba.jit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com