2011-10-24 131 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