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

また、最も遅い部分については考えないでください。[measure it](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

関連する問題