2016-10-11 5 views
1

Ich habe einen Datensatz, für den Werte, die bestimmte Kriterien erfüllen, zur Durchführung von Wahrscheinlichkeitsberechnungen als Teil einer Summierung verwendet werden. Derzeit halte ich die Daten in verschachtelten Wörterbüchern, um den Prozess der deterministischen Verarbeitung zu vereinfachen.Effiziente Iteration durch verschachtelte Python-Wörterbücher

Der Algorithmus, den ich verwende, erweist sich als sehr teuer und nach einer Weile überwältigt die Erinnerung.

Die psudocode für die Verarbeitung ist wie folgt:

for businessA in business : # iterate over 77039 values 
    for businessB in business : # iterate over 77039 values 
     if businessA != businessB : 
      for rating in business[businessB] : # where rating is 1 - 5 
       for review in business[businessB][rating] : 
        user = reviewMap[review]['user']; 
        if user in business[businessA]['users'] : 
         for users in business[businessA]['users'] : 
          # do something 
       # do probability 
       # a print is here 

Wie kann ich die oben effektiver zu halten genaue Wahrscheinlichkeit Summierung für jeden businessâ schreiben?


EDIT Quellcode einschließlich - hier businessâ und BusinessB ist in eigenen Wörterbücher, aber es ist erwähnenswert ist, dass sie die gleiche businessIDs (bid) in jedem halten. Es ist nur eine Änderung dessen, was der Wert für jedes Schlüssel: Wert-Paar ist.

+2

Können Sie Beispieleingabedaten und Ausgabedaten bereitstellen? Sie haben 'if BusinessA! = BusinessB:' was sind das? –

+0

businessA, BusinessB sind einzigartige Unternehmen in einem Wörterbuch von Unternehmen, so dass businessA nicht BusinessB ist (z. B. McDonalds ist nicht Wendy). –

+2

Halten Sie "Geschäft" im Speicher? Wie speichern Sie die Ergebnisse? –

Antwort

2

Es gibt mehr als 5 Milliarden Kombinationen von Unternehmen in Ihrem Datensatz, die wirklich das Gedächtnis hervorheben wird. Ich denke, du speicherst alle Ergebnisse im Gedächtnis; stattdessen würde ich Zwischenabbilder zu einer Datenbank machen und Ihre Behälter freigeben. Dies ist eine Skizze des Ansatzes, da ich keine echten Daten zum Testen habe, und es könnte einfacher sein, auf Ihre Schwierigkeiten zu reagieren, wenn Sie auf sie stoßen. Idealerweise würde es einen Zwischenbehälter für verschachtelte Listen geben, so dass Sie executemany verwenden könnten, aber dies ist so stark verschachtelt mit abgekürzten Namen und keine Testdaten, die schwer zu befolgen sind.

import sqlite3 

def create_interim_mem_dump(cursor, connection): 

    query = """CREATE TABLE IF NOT EXISTS ratings(
      Tbid TEXT, 
      Lbid TEXT, 
      posTbid TEXT) 
      """ 
    cursor.execute(query) 
    connection.commit() 


def crossMatch(TbidMap, cursor, connection) : 
    for Tbid in TbidMap : 
     for Lbid in LbidMap : 
      # Ensure T and L aren't the same business 
      if Tbid != Lbid : 
       # Get numer of reviews at EACH STAR rate for L 
       for stars in LbidMap[Lbid] : 
        posTbid = 0; 
        # For each review check if user rated the Tbid 
        for Lreview in LbidMap[Lbid][stars] : 
         user = reviewMap[Lreview]['user']; 
         if user in TbidMap[Tbid] : 
          # user rev'd Tbid, get their Trid & see if gave Tbid pos rev 
          for Trid in TbidMap[Tbid][user] : 
           Tstar = reviewMap[Trid]['stars']; 
           if Tstar in pos_list : 
            posTbid += 1; 
        query = """INSERT INTO ratings (Tbid, Lbid, posTbid) 
          VALUES (?, ?, ?)""" 
        cursor.execute(query, (Tbid, Lbid, posTbid)) 
     connection.commit() 



if __name__ == '__main__': 
    conn = sqlite3.connect('collated_ratings.db') 
    c = conn.cursor() 

    create_db = create_interim_mem_dump(c, conn) 
    your_data = 'Some kind of dictionary into crossMatch()' 
    c.close() 
    conn.close() 
Verwandte Themen