2013-06-23 23 views
0

我的程序似乎并没有终止...因为我相对较新的python我会怀疑我犯了一个常见的错误,我还没有看到。即使最近在Java中,我通过关闭文件解决了这样的简单问题...mysql python挂断调试

注意: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. 我能做些什么来找出我的代码在做什么?具体来说,我可以问问程序正在执行哪一行代码?

所有帮助非常感谢,并随时提出建议,使我的代码更Pythonic!我可以看到

+0

我收到你了吗?你正在寻找一个调试器? http://docs.python.org/2/library/pdb.html – bash0r

+0

我也在寻找我的错误在哪里......即使使用调试器,我仍然可能找不到它 – CodeKingPlusPlus

+0

我不喜欢python,因为它取决于在空白处。修复一个有选项卡的bug并且在下一行有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 = 25万时,这是一个相当巨大的低效率。我没有在代码中看到任何明显的错误,所以我猜测它没有返回的原因是因为它需要几个小时才能完成,而且你不会等那么久。

你可以尝试的一件事是用dict替换vSet。从看你的代码,它看起来像你使用VSET为正在查找各种用户ID的指数成员中唯一的东西,所以尝试更换此:

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

与此:

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

寻找的东西在一个字典中是一个O(1)操作,所以这应该让你到O(N)总运行时间。

此外,请注意,如果不是将uID放入查询字典(它可能会放在一行中),我只是将实际的user_id值 - 因为稍后会查找用户ID而不是行。我没有运行你的代码来测试它,但我怀疑它是否已经运行完成,你会发现你有零输出行,因为int不等于DB游标行,所以你的代码设置curRowcurCol永远不会成功。

哦,当然,你需要你的curRowcurCol片断更改为:

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

尝试使这些变化,并看看是否是你的代码更好地工作。

此外,在代码中散布print声明的建议是一个很好的建议。我通常会在进入调试器之前先尝试一下,大部分时间足以让我知道代码在做什么,而且我不需要拿出调试器的大枪。如果你确实需要一个Python调试器,谷歌的pdb,并阅读如何使用它。您可以从命令行使用它,或者将它集成到您​​使用的任何IDE中,具体取决于您喜欢的工作方式。