Python 为什么删除此项会使我的代码运行得更快?
我正在用python浏览一个数据库,并使用Python 为什么删除此项会使我的代码运行得更快?,python,sql,exception,optimization,try-catch,Python,Sql,Exception,Optimization,Try Catch,我正在用python浏览一个数据库,并使用try和,除了以外的很多方法来处理查询。在试图优化我的代码时,我遇到了一个奇怪的问题 此代码: try: cursor.execute("SELECT my_name FROM {}.{} LIMIT 1".format(myschema,mytable)) except(Exception, psycopg2.DatabaseError) as error: conn.rollback() else: origName = cu
try
和,除了
以外的很多方法来处理查询。在试图优化我的代码时,我遇到了一个奇怪的问题
此代码:
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
块非常常见,而且使用起来非常便宜。try-except
比false-if语句if-A!=1:
else子句本身很有趣。它在没有异常但在finally子句之前运行。这是其主要目的。因此,如果您的try-except
块未捕获,else语句仍会运行。这是它减慢代码速度的主要原因
如果没有else子句,在完成之前运行其他代码的唯一选项是将代码添加到try子句的笨拙做法。这是笨拙的,因为它有可能在不受try块保护的代码中引发异常
在完成之前运行额外的无保护代码的用例并不经常出现。因此,不要期望在已发布的代码中看到许多示例。这有点罕见
在第二个版本中,如果出现错误,您可以
fetchone
无论如何,不获取任何内容,然后中止整个过程(或者fetchone
引发异常,您以这种方式中止)。是的,在第一个版本中,如果没有错误,则运行else块。因此,如果出现错误,则不会返回,第二次try/except将运行。在第二个示例中,“else块”代码始终运行,因此如果出现错误,在第二个try/except运行之前,它将以outputname ERROR2完成。也许试着看看这是不是真的发生了。就是这样,谢谢@jh44txh这个问题怎么回答?您是否认为18分钟的改进来自于对else
语句本身的评估?我不确定,因为在第二个版本中总是执行fetchone
块,而在第一个版本中不是,但是第二个版本更快。也许您可以包括更多的细节,比如jh44tx在注释中建议的细节,因为else语句中的块中有return语句,所以速度更快。