为什么删除这个让我的代码运行得更快?

时间:2017-04-18 21:50:15

标签: python sql exception optimization try-catch

我正在使用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:语句之后继续使用我的代码。

1 个答案:

答案 0 :(得分:-1)

这是因为在python世界try-except块非常常见并且使用起来非常便宜。 try-except比虚假if if a != 1:便宜。

else子句本身很有趣。它在没有异常但在finally子句之前运行。这是它的主要目的。因此,如果您的try-except块未捕获,则else语句仍会运行。这是它减慢代码速度的主要原因。

如果没有else子句,在完成之前运行其他代码的唯一选择就是将代码添加到try-clause中的笨拙做法。这是笨拙的,因为它有可能在代码中引发异常,而这些异常并不是由try-block保护的。

在最终确定之前运行其他未受保护的代码的用例不会经常出现。因此,不要期望在已发布的代码中看到许多示例。这有点罕见。

Look at this post for some more information