2015-11-30 112 views
1

我有一個api,它應該讓我從一系列事件中獲得場地細節。有大約10000個事件,生成列表的整個過程花費大約6.5秒,因爲服務器cpu使用率高達100%,頁面加載速度緩慢。我正在使用mongodb。這裏是功能: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

的主要途徑將是限制你解析事件的數量。只需使用像'for event_all [:100]'中的事件一樣的片段來僅發送前100個事件。你可以改變這個數字,或者它是否是列表開始或結束的事件。除此之外,您在循環開始時將所有值初始化爲空,但無論如何它們都會被設置爲空。你也可以初始化一個空字典來節省一些時間。 – SuperBiasedMan

+0

我必須一次解析所有的事件,因爲所有的事件都有一個場地的細節。我必須在選擇標籤中顯示所有場所作爲下拉菜單。唯一的問題是,花費太多時間來研究所有事件。還有其他建議嗎? –

+0

所有'event'項目都有'location'作爲屬性,並且所有'location'項目都有'parent'作爲屬性嗎? – zehnpaard

回答

1

隨着select_related就可以避免在for循環中額外的數據庫查詢(見文檔: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