#python
Вопрос:
У меня есть код с двумя списками словарей, и я должен составить окончательный словарь на основе сравнения двух списков.
Это и есть код:
list_a = [
{'e1':20},
{'e1':11.2},
{'e1':20.33},
{'e1':19.34},
{'e1':18.2}
]
list_b = [
{'id': 1, 'e1':20, 'status':True},
{'id': 2, 'e1':11.2, 'status':False},
{'id': 3, 'e1':20.33, 'status':True}
]
mydict = {}
for b in list_b:
mydict.setdefault(b['id'], {})
if b['status']:
for a in list_a:
if b['e1'] - a['e1'] > 1:
mydict[b['id']] = b['e1'] - a['e1']
Просто интересно, есть ли у вас какое-либо решение, чтобы сделать этот код более эффективным (как в плане скорости, так и в плане пространства)?
Комментарии:
1. Эффективная скорость, эффективное пространство или эффективный размер файла?
2. Пожалуйста, добавьте ожидаемый результат
3. @J2015 Вы используете какой-либо импорт? Это не работает для меня, как представлено в python 3.7.
4. Ваш код не работает, поэтому в настоящее время невозможно сделать его более эффективным (по крайней мере, не в обычном смысле).
5. Есть codereview.stackexchange.com , что может быть более подходящим для вашего вопроса.
Ответ №1:
Один из способов сократить время-избегать использования mydict.setdefault
,
import time
list_a = [
{'e1': 20},
{'e1': 11.2},
{'e1': 20.33},
{'e1': 19.34},
{'e1': 18.2}
]
list_b = [
{'id': 1, 'e1': 20, 'status': True},
{'id': 2, 'e1': 11.2, 'status': False},
{'id': 3, 'e1': 20.33, 'status': True}
]
time_original = 0
time_new = 0
for loop in range(1000000):
time1 = time.time()
mydict = {}
for b in list_b:
mydict.setdefault(b['id'], {})
if b['status']:
for a in list_a:
if b['e1'] - a['e1'] > 1:
mydict[b['id']] = b['e1'] - a['e1']
time2 = time.time()
time_original = time2 - time1
time3 = time.time()
example_dict = {}
for b in list_b:
example_dict[b['id']] = {}
if b['status']:
for a in list_a:
if b['e1'] - a['e1'] > 1:
example_dict[b['id']] = b['e1'] - a['e1']
time4 = time.time()
time_new = time4 - time3
print('Using mydict.setdefault(b['id'], {})')
print(time_original / 1000000)
print(mydict)
print()
print('Using example_dict[b['id']] = {}')
print(time_new / 1000000)
print(example_dict)
Результаты,
Using mydict.setdefault(b['id'], {})
2.1369829177856445e-06
{1: 1.8000000000000007, 2: {}, 3: 2.129999999999999}
Using example_dict[b['id']] = {}
2.096635103225708e-06
{1: 1.8000000000000007, 2: {}, 3: 2.129999999999999}
Комментарии:
1. сокращение на 0,04 е-06 — это 0,00000004 секунды …. кажется отчасти бессмысленным? Кроме того, использование defaultdict(dict) было бы еще быстрее ….
2. @PatrickArtner Я согласен, что экономия времени бессмысленна, однако это чисто академическое наблюдение. defaultdict(dict) не выдает тот же результат, длина результирующего dict будет только 2, а не 3.