[英]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.