我正在使用python访问数据库并使用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:
语句之后继续使用我的代码。
答案 0 :(得分:-1)
这是因为在python世界try-except
块非常常见并且使用起来非常便宜。 try-except
比虚假if if a != 1:
便宜。
else子句本身很有趣。它在没有异常但在finally子句之前运行。这是它的主要目的。因此,如果您的try-except
块未捕获,则else语句仍会运行。这是它减慢代码速度的主要原因。
如果没有else子句,在完成之前运行其他代码的唯一选择就是将代码添加到try-clause中的笨拙做法。这是笨拙的,因为它有可能在代码中引发异常,而这些异常并不是由try-block保护的。
在最终确定之前运行其他未受保护的代码的用例不会经常出现。因此,不要期望在已发布的代码中看到许多示例。这有点罕见。