2016-03-31 74 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