1

単純な数式を含む 50,000 行の文字列があるとします (+,- 演算子のみ、たとえば 1+2+3+5 を含みます)。これらの文字列を評価するには、Python で eval() を使用すると便利です。ただし、プログラムは十分に効率的ではありません。cProfile を実行したところ、ボトルネックのほとんどが eval 関数によるものであることがわかりました (50,000 行の場合で約 2.5 秒)。私は独自の評価パーサーを作成しようとしましたが、評価よりもさらに遅く実行されます。

それで、私が聞きたいのは、数式文字列を高速に評価する方法や、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 µs かかります。eval('1+23-4+56-7')

ただし、連続した + と - は処理されないことに注意してください。1-+2または1--2、またはスペース: 1 - 2

于 2013-05-24T06:51:57.870 に答える