1

假设我有 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)
4

1 回答 1

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 和 13 µseval('1+23-4+56-7')

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

于 2013-05-24T06:51:57.870 回答