在python中使用exec和compile
我想要一本字典,其中的值是一个语句。我不需要动态构建语句。语句中出现的名称在本地范围内。下面是一个简单的例子。似乎“exec”是应该使用的东西,但这似乎是不受欢迎的,而且可能很慢。此代码将在随机建模器中使用,并将运行数百万次。你能建议我如何最好地实现这个想法(也许是通过预编译?)。是不是我已经有这个权利了 干杯 杰夫在python中使用exec和compile,python,dictionary,compilation,exec,Python,Dictionary,Compilation,Exec,我想要一本字典,其中的值是一个语句。我不需要动态构建语句。语句中出现的名称在本地范围内。下面是一个简单的例子。似乎“exec”是应该使用的东西,但这似乎是不受欢迎的,而且可能很慢。此代码将在随机建模器中使用,并将运行数百万次。你能建议我如何最好地实现这个想法(也许是通过预编译?)。是不是我已经有这个权利了 干杯 杰夫 假设您正在定义x的某个范围内执行exec(d['plusone']),否则您将得到namererror 将callable放入dict并显式传递x(并显式分配给x)似乎要好得多:
假设您正在定义
x
的某个范围内执行exec(d['plusone'])
,否则您将得到namererror
将callable放入dict
并显式传递x
(并显式分配给x
)似乎要好得多:
谢谢关键是使用lambda函数并将参数传递给它。现在有一个关于速度的问题:这会很快吗?我想是的,因为字节码只编译了一次——第一次调用函数?@VortexProf是的,应该相当快,因为您只需要编译一次。导入操作符可能有助于提高性能,也可能没有帮助,但它允许您灵活使用。也就是说,您可以将裸操作符
add
放在dict中,然后执行类似d['plus'](x,1)
的操作,以实现与plusone
op相同的功能,并且可以灵活地加上任何数字。
d={'plusone':'x+=1','minusone':'x-=1'}
x=2
exec(d['plusone'])
print x ::: output '3'
exec(d['minusone'])
print x ::: output '2'
from operator import add, sub
d={'plusone':lambda x: add(x,1), 'minusone':lambda x: sub(x,1)}
x = 2
x = d['plusone'](x)
x
Out[17]: 3