2016-03-31 33 views
1

我寫這段代碼,但我覺得它非常慢,我不知道如何真正改善它的時間。 data是一個約有70 000個鍵的json對象。我認爲最慢的部分是actors部分,因爲我在列表中迭代(最多包含3個元素)。我該如何優化時間這個Python代碼

genres_number = {} 
actors_number = {}  
for movie in data: 
    for genre in data[movie]["genres"]: 
     if data[movie]["actors"] != None: 
      for actor in data[movie]["actors"]: 
       if actor not in actors_number.keys(): 
        actors_number[actor] = 1 
       else: 
        actors_number[actor] = actors_number[actor] + 1 
     if genre not in genres_number.keys(): 
      genres_number[genre] = 1 
     else: 
      genres_number[genre] = genres_number[genre] + 1 
res = [] 
res.append(genres_number) 
res.append(actors_number) 
return res 
+2

你能不能給我們介紹一下如何「數據」的想法構成的? – Erik

+1

另外,不要考慮什麼是最慢的部分,[衡量它](https://docs.python.org/2/library/profile.html)。 –

回答

1

這是如何對你的工作

from collections import defaultdict 

def get_stats(data): 
    genres_number = defaultdict(int) 
    actors_number = defaultdict(int) 

    for movie in data: 

     actors = movie.get('actors') 
     if actors: 
      for actor in actors: 
       actors_number[actor] += 1 

     genres = movie.get('genres') 
     for genre in genres: 
      genres_number[actor] += 1 

    res = [] 
    res.append(dict(genres_number)) 
    res.append(dict(actors_number)) 
    return res 
+0

爲什麼這會改善我的代碼? – mel

+0

在你的代碼版本中,你有一個三重嵌套循環(對於電影中流派的演員),但是你引用數據的方式表明流派和演員之間沒有任何關係。所以通過將其轉換爲這種雙重嵌套結構,您不會多次循環。 – John