#python #python_3x #оптимизация #sympy
Насколько расчеты встроенными операторами Python быстрее, чем расчет по формуле SymPy и numexpr?
Ответы
Ответ 1
Как на счет использования анаболиков numexpr? from itertools import combinations import numpy as np import numexpr as ne lst = list(combinations(range(1, 23), 6)) X = np.array(lst) formula = """(a+b)*c-(d/e)**f""" def std_op(lst): result = [] for i in lst: result.append((i[0]+i[1])*i[2]-(i[3]/i[4])**i[5]) return result def anabolics(X, formula): d = { "a": X[:, 0], "b": X[:, 1], "c": X[:, 2], "d": X[:, 3], "e": X[:, 4], "f": X[:, 5], } return ne.evaluate(formula, d) тесты: In [17]: sum(std_op(lst)) Out[17]: 8083104.010504639 In [18]: anabolics(X, formula).sum() Out[18]: 8083104.01050503 скорость: In [19]: %timeit std_op(lst) 44.1 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) In [20]: %timeit anabolics(X, formula) 590 µs ± 14.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) вывод: numexpr + numpy в ~75 раз быстрее Vanilla Python: In [21]: 44.1*1000 / 590 Out[21]: 74.7457627118644Ответ 2
Код теста: from itertools import combinations from sympy import symbols lst = list(combinations(range(1, 23), 6)) a, b, c, d, e, f = symbols('a b c d e f') formula = (a+b)*c-(d/e)**f print(formula) def std_op(lst): result = [] for i in lst: result.append((i[0]+i[1])*i[2]-(i[3]/i[4])**i[5]) return result def sympy(lst): result = [] for i in lst: result.append(formula.subs(zip([a, b, c, d, e, f], i)).n()) return result %timeit std_op(lst) result = std_op(lst) print(len(result), result[0], result[-1]) %timeit sympy(lst) result = sympy(lst) print(len(result), result[0], result[-1]) Результат теста: c*(a + b) - (d/e)**f 19.3 ms ± 205 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 74613 8.737856 664.6581501289133 18.4 s ± 81 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 74613 8.73785600000000 664.658150128913 Итог: Операторы Python победили с результатом: 19.3 ms против 18.4 s 18 секунд! Таким образом, можно сделать вывод, что SymPy лучше не использовать в виде "калькулятора".
Комментариев нет:
Отправить комментарий