如何快速评估字符串中的 Python 代码?
How do I evaluate Python code from a string quickly?
我正在编写一个程序,该程序必须从字符串中执行 Python 代码数百万次。有没有比使用 eval()
更快的方法来做到这一点? 运行eval()
中的代码大约需要100微秒,而运行嵌入程序中的代码只需要8微秒。有没有类似eval()
的方法,执行时间更短?
我会重组您的代码,这样它就不必 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
提前完成。
我正在编写一个程序,该程序必须从字符串中执行 Python 代码数百万次。有没有比使用 eval()
更快的方法来做到这一点? 运行eval()
中的代码大约需要100微秒,而运行嵌入程序中的代码只需要8微秒。有没有类似eval()
的方法,执行时间更短?
我会重组您的代码,这样它就不必 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
提前完成。