Я бы реструктурировал ваш код так, чтобы он не должен был eval
ed (например, взять аргумент функции вместо строки)
Если уравнение обязательно должно быть из строки, вы может скомпилировать его заранее:
In [1]: x = y = 0
In [2]: %timeit eval('x ** 2 + y')
5.95 µs ± 223 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [3]: code = compile('x ** 2 + y', '<string>', 'eval')
In [4]: %timeit eval(code)
608 ns ± 9.88 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Вместо того, чтобы eval
компилировать строку в байт-код при каждом ее вызове, compile
делает это заранее.