假设我有 50,000 行包含简单数学表达式的字符串(仅 +,- 运算符涉及例如 1+2+3+5)。我知道在 Python 中使用 eval() 来评估这些字符串很方便。但是,该程序的效率不够高。我运行了 cProfile,发现大部分瓶颈来自 eval 函数(在 50,000 行的情况下大约需要 2.5 秒)。我尝试编写自己的评估解析器,但它的执行速度甚至比 eval 还要慢。
那么,我想问的是,有没有什么方法可以快速计算数学表达式字符串或者提高eval()的性能?不能使用第三方包。
最初的问题是这样的 我们有一个像 1234567 这样的数字字符串,我们可以在数字之间插入 +、- 或什么都没有,比如 1+23-4+56-7。所以给定的数字字符串会有 3^(digit-1) 个组合
我在 Python 中实现的计算和生成字符串的方法如下
import itertools
def gen_Eq(op, num):
temp = [None]*(2*len(num)-1)
temp[::2] = num
temp[1::2] = op
string = ''.join(temp)
return string
def cal_Eq(num_string):
op_list = tuple(itertools.product(['+','-',''],repeat=len(num_string)-1))
eq = list(map(gen_Eq,op_list,itertools.repeat(num_string,len(op_list))))
print map(eval,eq)