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

我正在用python浏览一个数据库,并使用
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语句,所以速度更快。