[英]Why does removing this else make my code run so much faster?
我正在使用python遍歷數據庫,並try
使用try
和except
處理查詢。 在嘗試優化代碼時,我遇到了一個奇怪的難題。
這段代碼:
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:
語句之后繼續執行我的代碼。
這是因為在python世界中, try-except
塊非常普遍,而且使用起來非常便宜。 if a != 1:
:,則try-except
比false語句便宜。
其他條款本身很有趣。 它在沒有例外的情況下運行,但是在最終條款之前。 這是其主要目的。 因此,如果您的try-except
塊沒有捕獲,則else語句仍然運行。 這是它會降低代碼速度的主要原因。
如果沒有else子句,那么在最終確定之前運行其他代碼的唯一選擇就是將代碼添加到try子句的笨拙做法。 這很笨拙,因為它冒着在代碼中引發異常的危險,而這些異常本來不會受到try塊的保護。
在完成之前運行其他不受保護的代碼的用例很少出現。 因此,不要期望在已發布的代碼中看到很多示例。 這有點罕見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.