繁体   English   中英

使用python中的数学运算符提高字符串速度

[英]improving speed on strings with math operators in python

我正在使用一组可能包含数学运算符的字符串,目前为'+'或'-'。 最初我使用eval非常简单。 由于已知问题,我正试图摆脱评估,但主要是为了提高速度。 这是我要处理的一组典型字符串:

DAC = ('12','0x1E','34','12+20','2+0x1F')

取每个值并应用评估将得出我需要的结果。 为了避免这种情况,我尝试了几种方法,在我遇到数学运算符之前,它们都可以正常工作。 我确实读过有关AST模块的信息,并且会继续努力,但是如果它在提高速度或社区可以给我的任何其他建议方面走的正确,我想获得一些反馈。

谢谢

literal_eval什么问题? 这可能是您最好的选择,而不是编写或查找lex解析器,这对于这种情况肯定是过大了。

>>> DAC = ('12','0x1E','34','12+20','2+0x1F')
>>> from ast import literal_eval

您可以使用列表理解

>>> [literal_eval(i) for i in DAC]
[12, 30, 34, 32, 33]

map

>>> list(map(literal_eval, DAC))
[12, 30, 34, 32, 33]

正如我所测量的,在能够使用运算符的Python 3中, ast.literal_eval比普通的eval 一点。 因此最快的方法可能是:

def myeval(s):
    try: return int(s, 0)
    except ValueError: return eval(s)

将这个和您对DAC的定义放在x.py中之后,我将进行以下测量:

aleax-macbookair4:~ aleax$ python3 -mtimeit -s'import x' '[eval(a) for a in x.DAC]'
10000 loops, best of 3: 34 usec per loop
aleax-macbookair4:~ aleax$ python3 -mtimeit -s'import x' '[x.myeval(a) for a in x.DAC]'
10000 loops, best of 3: 22.9 usec per loop

因此,适度的加速。

实际上,一次“ LBYL”方法可能比通常首选的“ EAFP”方法好一点:在x.py中添加以下内容

def alteval(s):
    if '+' in s or '-' in s: return eval(s)
    else: return int(s, 0)

然后,我测量:

aleax-macbookair4:~ aleax$ python3 -mtimeit -s'import x' '[x.alteval(a) for a in x.DAC]'
100000 loops, best of 3: 18.1 usec per loop

另一个(虽然较小)的性能提高。 (我也尝试过使用re来确定s是否具有正负号,但这似乎要慢一些)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM