Вычисление значения математического выражения из строки
📁 python
Есть строка, содержащая математическое выражение вида:
1/3+2/3Есть ли модуль, который вычисляет значение таких выражений?
С точки зрения безопасности (как уже сказал - с eval() нужно быть очень осторожным), производительности и гибкости лучше воспользоваться :
In [6]: import numexpr as neIn [7]: ne.evaluate('1/3+2/3')Out[7]: array(1.0)In [8]: var1=10In [9]: var2=2In [10]: ne.evaluate('var1**var2')Out[10]: array(100, dtype=int32)Он, кстати, быстрее для более сложных вычислений, поддерживает использование переменных, поддерживает NumPy, SciPy и т.д.
поддерживает многопоточные вычисления (используя все доступные ядра процессора) и VML от Intel (Vector Math Library, который интегрирован в интеловский же Math Keel Library (MKL)).
Пример работы с обычным (""Vanilla Python"") массивом:
In [45]: lst = [1, 2.718281828]In [46]: ne.evaluate('log(lst)')Out[46]: array([ 0., 1.])с NumPy массивом:
In [50]: a = np.array([1, 2.718281828])In [51]: ne.evaluate('log(a)')Out[51]: array([ 0., 1.])Сравнение производительности с NumPy для массива, состоящего из 1го млн. элементов типа numpy.float64:
In [36]: a = np.random.rand(10**6)In [37]: a.shapeOut[37]: (1000000,)In [38]: len(a)Out[38]: 1000000In [39]: %timeit np.log(a)10 loops, best of 3: 24.3 ms per loopIn [40]: %timeit ne.evaluate('log(a)')100 loops, best of 3: 5.45 ms per loopIn [41]: %timeit np.sqrt(np.sin(a)**2 + np.cos(a)**2)10 loops, best of 3: 84.5 ms per loopIn [42]: %timeit ne.evaluate('sqrt(sin(a)**2 + cos(a)**2)')100 loops, best of 3: 6.32 ms per loop Войдите чтобы оставить ответ