2016-03-31 50 views
1

olarak zaman içinde nasıl optimize edebilirim Bu kodu yazarım ama çok yavaş buluyorum ve zaman içinde gerçekten nasıl geliştireceğimi bilmiyorum. data, içinde yaklaşık 70.000 anahtar bulunan bir json nesnesidir. En yavaş kısım actors bölümü olduğunu düşünüyorum çünkü bir liste üzerinde yineliyorum (en fazla 3 öğe içerir).Bu python kodu

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

bize nasıl 'veriler' hakkında fikir verebilir bu işi yapılandırılmıştır geliyor? – Erik

+1

Ayrıca, en yavaş bölümün ne olduğunu düşünmeyin [ölçün] (https://docs.python.org/2/library/profile.html). –

cevap

1

nasıl

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

Bu neden kodumu geliştiriyor? – mel

+0

Kodun versiyonunda üçlü bir iç içe döngü (film türündeki aktörler için) vardır, ancak verilere referans verme yönteminiz, türlerin ve aktörlerin birbiriyle hiçbir ilişkisinin olmadığını gösterir. Böylece, bu çift iç içe geçmiş yapıya dönüştürerek, birçok kez döngü yapmıyorsunuz. – John