在python中评估数学表达式的更好方法?

时间:2013-05-24 04:32:17

标签: python eval

假设我有50,000行包含简单数学表达式的字符串(仅+, - 运算符涉及例如1 + 2 + 3 + 5)。我知道在Python中使用eval()来评估这些字符串很方便。但是,该计划效率不高。我运行了cProfile,发现大部分瓶颈来自eval功能(在50,000行的情况下大约2.5秒)。我已经尝试编写自己的评估解析器,但它的执行速度比eval慢。

那么,我想问的是,有没有办法快速评估数学表达式字符串或提高eval()的性能?无法使用第三方软件包。

最初的问题是这样的 我们有一个像1234567这样的数字字符串,我们可以在数字之间插入+, - 或任何内容,如1 + 23-4 + 56-7。因此,给定数字字符串

将有3 ^(数字-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)

1 个答案:

答案 0 :(得分:0)

这种方法更快:

>>> import re
>>> split_numbers = re.compile(r'-?\d+').findall
>>> sum(int(x) for x in split_numbers('1+23-4+56-7'))
69

在我的时间中,sum表达式需要4.5μs而eval('1+23-4+56-7')需要13μs

但请注意,它不处理连续的+和 - ,例如。 1-+21--2或空格:1 - 2