在python中计算数学表达式的更好方法?

2024-04-30 05:37:03 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有50000行字符串包含简单的数学表达式(只有+,-运算符涉及例如1+2+3+5)。我知道在Python中使用eval()来计算这些字符串是很方便的。然而,该方案的效率还不够高。我运行cProfile,发现大部分瓶颈来自eval函数(50000行的情况下大约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)

Tags: 字符串stringlen表达式eval数字数学性能
1条回答
网友
1楼 · 发布于 2024-04-30 05:37:03

这种方法更快:

>>> 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-+2或{},或者空格:1 - 2。在

相关问题 更多 >