Минимизация объема кода python с помощью вложенных циклов

#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.