2015-11-30 4 views
1

У меня есть api, который должен получить информацию о месте проведения мероприятия из набора событий. Существует около 10000 событий, и весь процесс генерации списка занимает около 6,5 секунд, из-за чего загрузка сервера cpu достигает 100%, а загрузка страницы идет медленно. Я использую mongodb. Вот эта функция:Slow for loop in python

def get_venue(): 
events_all = Event.objects.all() 
locality = "" 
venue = [] 
data = ({'success':False, 'venue': venue}) 
for event in events_all: 
    venue_json = {'venue_name':"", 'local':"", 'locat_id':""} 
    try: 
     try: 
      venue_json['venue_name'] = event.location.location_name 
     except Exception as e: 
      venue_json['venue_name'] = "" 
     try: 
      venue_json['local'] = event.location.parent.location_name 
     except Exception as e: 
      venue_json['local'] = "" 
     venue_json['locat_id'] = event.location.location_id 
     venue.append(venue_json) 
    except Exception as e: 
     continue 
if len(venue) > 0: 
    data['success'] = True 
return json.dumps(data) 

Если я удаляю петлю, страница загружается в секунду. Есть ли способ оптимизировать это и сократить время цикла до минимального?

+0

Основной способ был бы ограничить количество событий вы разбор. Просто используйте срез типа 'для события в events_all [: 100]' только для первых 100 событий. Вы можете изменить номер или события в начале или конце списка. Кроме того, вы инициализируете все значения как пустые в начале цикла, но все равно они все равно устанавливаются после этого. Вы можете также инициализировать пустой словарь, чтобы сэкономить немного времени. – SuperBiasedMan

+0

Мне нужно разобрать все события сразу, потому что все события содержат информацию о месте проведения. И я должен отображать все места в раскрывающемся списке в теге select. Единственная проблема заключается в том, что для прохождения всех событий требуется слишком много времени. Любые другие предложения? –

+0

все элементы 'event' имеют атрибуты' location', а все элементы 'location' имеют' parent' в качестве атрибутов? – zehnpaard

ответ

1

С select_related вы можете избежать дополнительного поиска в базе данных в течение цикла (см Документов https://docs.djangoproject.com/en/1.8/ref/models/querysets/#select-related):

events_all = Event.objects.all().select_related('location__parent') 
+0

Я использую колбу. Поддерживается ли это также в колбе? –

+0

Idk, это синтаксис Django, но в колбе должна быть аналогичная функциональность: http: //stackoverflow.com/questions/27983129/how-to-select-related-in-flask-sqlalchemy – schwobaseggl