2017-04-18 66 views
1

我正在通過一個數據庫與python和使用tryexcept很多來處理查詢。在試圖優化我的代碼時,我遇到了一個奇怪的顛簸。爲什麼刪除這個還會讓我的代碼運行得更快?

此代碼:

try: 
    cursor.execute("SELECT my_name FROM {}.{} LIMIT 1".format(myschema,mytable)) 
except(Exception, psycopg2.DatabaseError) as error: 
    conn.rollback() 
else: 
    origName = cursor.fetchone() 
    if origName is None: 
     outputName = "ERROR2" 
     return outputName 
try: 
    cursor.execute("SELECT different_column FROM {}.{} ORDER by a_column DESC LIMIT 1".format(myschema, mytable)) 
except(Exception, psycopg2.DatabaseError) as error: 
    conn.rollback() 
    try:... 
     #more try/excepts and so on 

約需19分鐘通過整個數據倉庫運行。

但是這個代碼:

try: 
    cursor.execute("SELECT my_column FROM {}.{} LIMIT 1".format(myschema,mytable)) 
except(Exception, psycopg2.DatabaseError) as error: 
    conn.rollback() 

origName = cursor.fetchone() 
if origName is None: 
    outputName = "ERROR2" 
    return outputName 
try: 
    cursor.execute("SELECT different_column FROM {}.{} ORDER by a_column DESC LIMIT 1".format(myschema, mytable)) 
except(Exception, psycopg2.DatabaseError) as error: 
    conn.rollback() 
    try:... 
     #exact same code with try/excepts and so on 

硬是完成了約1-1.5分鐘運行。爲什麼如果我刪除了那麼快呢?是被跳過/忽略?我覺得我一定會做錯的。我不明白如何在try:except:聲明之後繼續使用我的代碼。

+2

在第二個版本中,如果有一個錯誤,你'fetchone'無論如何,獲得無,並中止整個事情(或者'fetchone'拋出一個異常,你放棄這種方式)。 – user2357112

+1

是的,在第一個,如果沒有錯誤,else塊運行。所以如果出現錯誤,就沒有回報,第二次嘗試/除了運行。在第二個中,「else block」代碼總是運行,所以如果你有錯誤,它會在第二次嘗試/除了運行之前以輸出名ERROR2結束。也許嘗試看看是否發生了什麼。 – jh44tx

+1

就是這樣,謝謝@ jh44tx – Acoustic77

回答

-1

這是因爲在蟒蛇世界try-except塊非常普遍且使用起來非常便宜。 A try-except比if if語句if a != 1:便宜。

else子句本身很有趣。它在沒有異常但在finally子句之前運行。這是它的主要目的。所以如果你的try-except塊沒有捕獲,else語句仍然運行。這是它減慢你的代碼的主要原因。

沒有else子句,在最終化之前運行其他代碼的唯一選擇是將代碼添加到try子句的笨拙做法。這很笨拙,因爲它可能會引發代碼中的異常,而這些異常並不打算受到try-block的保護。

在最終確定之前運行額外的未受保護代碼的用例並不經常出現。所以,不要期望在發佈的代碼中看到很多例子。這很少見。

Look at this post for some more information

+0

這是如何回答這個問題的?你是否認爲18分鐘的改進來自對'else'聲明本身的評估?我不確定,因爲在第二個版本中,'fetchone'塊總是執行,而在第一個版本中不是,但第二個版本更快。 也許你可以包含更多的細節,比如jh44tx在註釋中建議的細節,因爲else語句中塊中的return語句,速度更快。 – justhalf

相關問題