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