4

これが私の状況です、私は次のような文字列を持っています

'a':1 'b':2 'c':3

これを口述に変えたいので、2つのオプションがあります。

  1. 文字列を分割してから、ペアをに配置し' 'ます。':'dict

  2. 、を追加し、文字列に置き換え' 'て、を使用して。を取得します。',''{''}'eval()dict

だから私の質問はどちらが速いですか?

4

3 に答える 3

10

私はこのようにします:

import ast
result = ast.literal_eval(''.join(["{", s.replace(" ", ", "), "}"]))

これを行うこともできます(違いはごくわずかかもしれませんが):

import ast
result = ast.literal_eval("{" + s.replace(" ", ", ") + "}")

この目的には、を使用するよりも安全であるため、使用することをお勧めast.literal_evalます。eval()

于 2012-06-15T08:57:53.063 に答える
6

わかりました、これまでのところすべてです:

import ast, re, json

s = "'a':1 'b':2 'c':3"

def a_eval(s):
    s = s.replace(' ', ',')
    return eval('{%s}' % s)

def a_ast(s):
    s = s.replace(' ', ',')
    return ast.literal_eval('{%s}' % s)

def a_parse(s):
    d = {}
    for p in s.split():
        k, v = p.split(':')
        d[k.strip("'")] = int(v)
    return d

def a_re(s):
    d = []
    re.sub(r"'(\w+)':(\w+)", lambda m: d.append(m.groups()), s)
    return dict((a, int(b)) for a, b in d)

def a_json(s):
    s = s.replace(' ', ',')
    s = s.replace("'", '"')
    return json.loads('{%s}' % s)

#eof

import timeit    
setup = open(__file__).read().split('#eof')[0]
results = []

for p in dir():
    if p.startswith('a_'):
        results.append((timeit.timeit('%s(s)' % p, setup, number=10000), p))

for p in sorted(results):
    print '%.4f %s' % p

結果:

0.0753 a_parse
0.1068 a_json
0.1455 a_re
0.2211 a_eval
0.3297 a_ast

そして、より長い文字列でjsonは、勝者です:

long_s = ((s + ' ') * 100).strip()

for p in dir():
    if p.startswith('a_'):
        results.append((timeit.timeit('%s("%s")' % (p, long_s), setup, number=100), p))

for p in sorted(results):
    print '%.4f %s' % p

結果:

0.0166 a_json
0.0528 a_parse
0.0565 a_re
0.0927 a_eval
0.1519 a_ast
于 2012-06-15T09:25:31.587 に答える
2

json.loadsよりも速いast.literal_eval

$ python -m timeit -s "s = '\'a\':1 \'b\':2';s = '{' + s.replace(' ', ', ') + '
}'; import json" "json.loads(s.replace('\'', '\"'))"
100000 loops, best of 3: 5.11 usec per loop

$ python -m timeit -s "s = '\'a\':1 \'b\':2';s = '{' + s.replace(' ', ', ') + '
}'; import ast" "ast.literal_eval(s)"
100000 loops, best of 3: 19.4 usec per loop
于 2012-06-15T09:14:17.413 に答える