2011-10-24 107 views
4

Python eval非常慢。我需要用逻辑运算符来评估简单的布尔表达式(比如“True or False”)。我正在为数千行数据做这件事,并且在性能方面eval是一个巨大的瓶颈。这真的很慢..任何替代方法?替代Python中的eval

我试着创建一个dict可能的表达组合和他们的预期输出,但这真的很丑!

我有下面的代码的那一刻:

eval('%s %s %s' % (True, operator, False)) 
+3

你究竟在做什么?在99%的案例中,使用eval的人确实不需要它,如果没有它,情况会好得多。我很确定你在这个组里。 –

+0

好吧,我只需要评估数千行的布尔表达式。正如你所说,我确实属于99%的类别。下面的解决方案是惊人的! – user955632

回答

13
import operator 
ops = { 'or': operator.or_, 'and': operator.and_ } 
print ops[op](True, False) 
1

这不是很清楚,我怎么@ CatPlusPlus的解决方案将评估任何布尔表达式。以下是Boolean expression parser/evaluator的pyparsing wiki示例页面中的一个示例。这里是这个脚本的测试用例:

p = True 
q = False 
r = True 
test = ["p and not q", 
     "not not p", 
     "not(p and q)", 
     "q or not p and r", 
     "q or not (p and r)", 
     "p or q or r", 
     "p or q or r and False", 
     ] 

for t in test: 
    res = boolExpr.parseString(t)[0] 
    print t,'\n', res, '=', bool(res),'\n' 
+0

我已经实现了一个解析器,它将复杂表达式转换为简单的布尔表达式(运算符,括号等的优先级)。在一天结束时,我只需要评估“True or False”等内容,这就是为什么上述解决方案适用于我的原因! – user955632