Shaman
Это было как пример, того что eval небезопасен, и команда может быть любой!
Если использовать json, то все чуть лучше.
# -*- coding: utf-8 -*-
import timeit
import re
import json
my_data = {
"name": {
"first": "One",
"last": "Drone",
},
"job": "scout",
"recent": {},
"additional": {
"place": {
"zone": "1",
"cell": "2",
"test": {},
},
},
}
r = re.compile(r'\{\}', re.MULTILINE).sub
def he_simple_func1(d):
eval(re.sub(r'\{\}', '""', str(d)))
def he_simple_func2(d):
return json.loads(r('""', str(d)).replace("'", "\""))
def fix_my_dict(my_dict):
for name, value in my_dict.items():
if isinstance(value, dict) and not value:
my_dict[name] = ""
elif isinstance(value, dict):
my_dict[name] = fix_my_dict(value)
return my_dict
print(timeit.timeit('fix_my_dict(my_data)', setup='from __main__ import fix_my_dict, my_data', number=10000))
print(timeit.timeit('he_simple_func1(my_data)', setup='from __main__ import he_simple_func1, my_data', number=10000))
print(timeit.timeit('he_simple_func2(my_data)', setup='from __main__ import he_simple_func2, my_data', number=10000))
0.160768985748
0.712203979492
0.274708032608
Тоже самое на 100000 вызовов.
0.837685108185
6.74191403389
2.77304005623