Альтернатива eval в Python - PullRequest
       25

Альтернатива eval в Python

4 голосов
/ 25 октября 2011

Python eval довольно медленный.Мне нужно оценить простое логическое выражение с помощью логических операторов (например, «Истина или Ложь»).Я делаю это для тысяч строк данных, и eval является огромным узким местом с точки зрения производительности.Это очень медленно ... Какие-нибудь альтернативные подходы?

Я пытался создать dict возможных комбинаций выражений и их ожидаемый результат, но это действительно ужасно!

У меня есть следующий код намомент:

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

Ответы [ 2 ]

13 голосов
/ 25 октября 2011
import operator
ops = { 'or': operator.or_, 'and': operator.and_ }
print ops[op](True, False)
1 голос
/ 25 октября 2011

Мне не ясно, как решение @ CatPlusPlus будет оценивать любое логическое выражение. Вот пример на странице примеров pyparsing вики анализатора / оценки логических выражений . Вот тестовые примеры для этого скрипта:

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'
...