2017-02-03 3 views
1

Python과 Sympy를 사용하고 있습니다.Python에서 Sympy 부울 표현식을 평가하십시오.

x,y,z = Symbols('x,y,z') 
doc = {x : False, y : True, z: True} 
rule = Or(x, And(y,z)) 

내가 rule.eval(doc)True를 반환합니다 Sympy에서 함수를 찾고 있어요 :

나는 다음 있나요?

편집 : 현재 rule.subsrule.xreplace 모두 통화 당 약 0.0003 초로 느리게 수행됩니다. 이것은 비실용적이다. 이 IPython 준 후

X = tuple(doc.iterkeys()) 
f = lambdify(X, rule) 

:

+0

왜'rule.subs (doc)'를 할 수 없는지 궁금합니다. –

+0

안녕하세요, 당신 말이 맞아요, 나는 그것을 언급하지 않았습니다. 이것은 내가 사용했던'rule.subs'와'rule.xreplace' 둘 다 예상대로 작동하지만 테리 블 (teribble) 성능을 가지고 있습니다. 내 코드를 프로파일 링하여 각 실행에 약 0.0003 초가 걸리는 것을 보았습니다. 나는이 기능들을 많이 사용한다. 더 효율적인 방법을 찾고 있습니다 –

+0

그리고 sympy를 사용해야합니까? 그렇지 않다면 다음과 같이 할 수 있습니다 :'import operator as op; 규칙 = 람다 x, y, z : op.or_ (x, op.and_ (y, z)); 규칙 (거짓, 참, 참)'. 그것이 더 빠르지 만 사전을 제공하지는 않습니다. –

답변

1

최소한의 코딩으로 더 나은 성능을 얻을 수있는 방법이 lambdify을 사용하는 것입니다

V = tuple(doc.itervalues()) 
%timeit f(*V) 
The slowest run took 7.56 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000000 loops, best of 3: 209 ns per loop 

나는 경고가 결론에 영향을 미칠 수있는 얼마나 확실하지 않다 , 그러나 명확한 개선이있다. 동일한 컴퓨터에서 원래 코드와 함께 :

%timeit rule.xreplace(doc) 
10000 loops, best of 3: 126 µs per loop 

하위가 더 느려졌습니다.

0

직접 평가판을 사용하는 대신 직접 평가판을 사용할 수 있습니까?

>>> F = Lambda((x, y, z), Or(x, And(y, z))) 
>>> F(0, 1, 1) 
True 

그렇지 않은 경우 람다 양식을 통해 보조가 허용되는 장난감 수업을 만들 수 있습니까? 이 클래스는 아니지만이 아이디어를 제공합니다 : 람다 양식을 작성하고 평가 람다 형태를 돌려주는 것 잠수정 방법을 것이다

>>> def sub(f, d): 
...  F = Lambda(d.keys(), f) 
...  return F(*[d[k] for k in d.keys()]) 
>>> sub(Or(x,And(y,z)),{x:0,y:1,z:1}) 

클래스입니다.

관련 문제