如何在 python 中动态创建函数?
How do I dynamically make a function in python?
我在 python 中有一个计算机生成的 AST。我解释了这个 AST 2000 次,但这很慢。此外,此 AST 在运行时会发生变化,并且在编译时之前是未知的。我可以将我的 AST 代码生成为有效的 python 字符串,但我不知道如何执行它。为了给出一个概念性的概述,这就是我现在所拥有的:
def exec(AST):
{local variables}
{interpret AST over local variables 2000 times}
我愿意:
def exec(AST):
{local variables}
new_fn = make_lambda(to_python_string(AST))
{iterate new_fn over local variables 2000 times}
注意:对 exec
的不同调用将具有在运行时构建的全新未知 AST。
我目前的瓶颈在 AST 解释上,我希望动态函数生成会使其更快。
这个有效:
def fun1():
return 5
def fun2():
return 7
def make_lambda(x):
if x == 1:
return fun1
else:
return fun2
print(make_lambda(1)())
print(make_lambda(2)())
所以 python3.8 确实有一个 exec
命令接受一个字符串并执行它。如果您生成的函数调用局部变量,则有一些注意事项。
这个有效:
def exec(AST):
{local variables}
exec("def new_fn():\n" + to_python_string(AST), globals())
{iterate new_fn over local variables 2000 times}
这比解释 AST 快得多。
我在 python 中有一个计算机生成的 AST。我解释了这个 AST 2000 次,但这很慢。此外,此 AST 在运行时会发生变化,并且在编译时之前是未知的。我可以将我的 AST 代码生成为有效的 python 字符串,但我不知道如何执行它。为了给出一个概念性的概述,这就是我现在所拥有的:
def exec(AST):
{local variables}
{interpret AST over local variables 2000 times}
我愿意:
def exec(AST):
{local variables}
new_fn = make_lambda(to_python_string(AST))
{iterate new_fn over local variables 2000 times}
注意:对 exec
的不同调用将具有在运行时构建的全新未知 AST。
我目前的瓶颈在 AST 解释上,我希望动态函数生成会使其更快。
这个有效:
def fun1():
return 5
def fun2():
return 7
def make_lambda(x):
if x == 1:
return fun1
else:
return fun2
print(make_lambda(1)())
print(make_lambda(2)())
所以 python3.8 确实有一个 exec
命令接受一个字符串并执行它。如果您生成的函数调用局部变量,则有一些注意事项。
这个有效:
def exec(AST):
{local variables}
exec("def new_fn():\n" + to_python_string(AST), globals())
{iterate new_fn over local variables 2000 times}
这比解释 AST 快得多。