2013-06-23 3 views
0

Моя программа, кажется, не заканчивается ... Поскольку я относительно новичок в python, я бы заподозрил, что сделал общую ошибку, которую я пока не вижу. Даже недавно в Java я разрешил простые проблемы, например, закрыв файл ...mysql python hangup debugging

ПРИМЕЧАНИЕ:rt_table имеет около 250 000 строк. Перед этой программой python я написал эквивалентную Java-программу, и она не заставила себя долго ждать.

def create_AMatrix(): 
    """Create the adjacency table of the retweet network from rt_table to create an adjacency matrix""" 
    con = mdb.connect(host="localhost", user="root", passwd="", db="twitter")  
    cur = con.cursor(mdb.cursors.DictCursor) 
    #get vertex set of users in retweet network 
    cur.execute("select user_id from users") 
    rows = cur.fetchall() 
    vSet = list() 
    for uID in rows: 
     vSet.append(uID) 

    #populate adjacency table 
    cur.execute("select * from rt_table") 
    rows = cur.fetchall() 
    for row in rows: 
     sourceUserID = row["source_user_id"] 
     sourceUserName = row["source_user_name"] 
     rtUserID = row["rt_user_id"] 
     rtUserName = row["rt_user_name"] 
     try: 
      curRow = vSet.index(sourceUserID) 
      curCol = vSet.index(rtUserID) 
     except ValueError: 
      continue 
     cur.execute("select COUNT(*) from adjacency where r = %s and c = %s", (curRow, curCol)) 
     if cur.fetchone()['COUNT(*)'] == 0: 
      try: 
       cur.execute("insert into adjacency (r, c, val, source_user_id, source_user_name, rt_user_id, rt_user_name) values (%d, %d, %d, %d, %s, %d, %s"), (curRow, curCol, 1, sourceUserID, sourceUserName, rtUserID, rtUserName) 
       con.commit() 
      except: 
       con.rollback() 
     else: 
      try: 
       cur.execute("update adjacency set val = val+1 where r = %d and c = %d"), (curRow, curCol) 
       con.commit() 
      except: 
       con.rollback() 
    cur.close() 
    con.close() 
  1. Где моя ошибка?
  2. Что я могу сделать, чтобы узнать, что делает мой код? В частности, могу ли я спросить, какую строку кода выполняет программа?

Вся помощь очень признательна и не стесняйтесь делать предложения, чтобы сделать мой код более питоническим!

+0

Я вас понял? Вы ищете отладчик? http://docs.python.org/2/library/pdb.html – bash0r

+0

Я также ищу, где моя ошибка ... Я все еще не могу найти ее даже с отладчиком – CodeKingPlusPlus

+0

Мне не нравится python, потому что это зависит по пробелам. Это боль, чтобы исправить ошибку, где у вас есть вкладка, и в следующей строке у вас есть 4 пробела. Мне жаль, что я больше не могу помочь тебе. – bash0r

ответ

0

Одна потенциальная проблема, которую я могу увидеть этот фрагмент:

try: 
    curRow = vSet.index(sourceUserID) 
    curCol = vSet.index(rtUserID) 
except ValueError: 
    continue 

list.index() функция просматривает список в O (N) времени. Вы также называете это O (N) раз, поэтому ваша общая эффективность - O (N^2). При N = 250 000 это довольно большая неэффективность. Я не вижу никаких очевидных ошибок в вашем коде, поэтому я бы предположил, что причина, по которой он не возвращается, состоит в том, что для завершения потребуется несколько часов, и вы не дожидаетесь этого долго.

Одна вещь, которую вы могли бы попробовать - заменить vSet на dict. Глядя на ваш код, это выглядит, как единственное, что вы используете Vset для смотрит вверх индекс различных идентификаторов пользователей, поэтому попробуйте заменить это:

vSet = list() 
for uID in rows: 
    vSet.append(uID) 

с этим:

vSet = dict() 
for index, row in enumerate(rows): 
    vSet[row['user_id']] = index 

прогностического вещи up в dict - это операция O (1), поэтому это должно привести вас к O (N) общей продолжительности выполнения.

Также обратите внимание, что вместо того, чтобы помещать uID в lookup dict (который бы поместил в строку), я просто поместил фактическое значение user_id - потому что позже вы просматриваете идентификаторы пользователей, а не строки. Я не запускаю ваш код для его проверки, но я подозреваю, что если бы он запустился до завершения, вы бы обнаружили, что у вас есть нулевые строки вывода, потому что ints не сравнивается с строками курсора DB, поэтому ваш код устанавливает curRow и curCol никогда бы не преуспели.

О, и, конечно, вы должны изменить свой curRow и curCol сниппет для:

try: 
    curRow = vSet[sourceUserID] 
    curCol = vSet[rtUserID] 
except IndexError: 
    continue 

Попробуйте сделать эти изменения, и посмотреть, если это делает ваш код работать лучше.

Кроме того, совет посыпать print заявлениями в вашем коде является хорошим. Обычно я пытаюсь это сделать, прежде чем дотянуться до отладчика, и большую часть времени мне достаточно, чтобы понять, что делает код, и мне не нужно вытаскивать большие пушки отладчика. Если вы хотите отладчик Python, хотя, Google за pdb и прочитайте о том, как его использовать. Вы можете использовать его из командной строки или интегрировать в любую используемую IDE, в зависимости от того, как вы предпочитаете работать.