2017-04-18 65 views
1

我正在通过一个数据库与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:声明之后继续使用我的代码。

+2

在第二个版本中,如果有一个错误,你'fetchone'无论如何,获得无,并中止整个事情(或者'fetchone'抛出一个异常,你放弃这种方式)。 – user2357112

+1

是的,在第一个,如果没有错误,else块运行。所以如果出现错误,就没有回报,第二次尝试/除了运行。在第二个中,“else block”代码总是运行,所以如果你有错误,它会在第二次尝试/除了运行之前以输出名ERROR2结束。也许尝试看看是否发生了什么。 – jh44tx

+1

就是这样,谢谢@ jh44tx – Acoustic77

回答

-1

这是因为在蟒蛇世界try-except块非常普遍且使用起来非常便宜。 A try-except比if if语句if a != 1:便宜。

else子句本身很有趣。它在没有异常但在finally子句之前运行。这是它的主要目的。所以如果你的try-except块没有捕获,else语句仍然运行。这是它减慢你的代码的主要原因。

没有else子句,在最终化之前运行其他代码的唯一选择是将代码添加到try子句的笨拙做法。这很笨拙,因为它可能会引发代码中的异常,而这些异常并不打算受到try-block的保护。

在最终确定之前运行额外的未受保护代码的用例并不经常出现。所以,不要期望在发布的代码中看到很多例子。这很少见。

Look at this post for some more information

+0

这是如何回答这个问题的?你是否认为18分钟的改进来自对'else'声明本身的评估?我不确定,因为在第二个版本中,'fetchone'块总是执行,而在第一个版本中不是,但第二个版本更快。 也许你可以包含更多的细节,比如jh44tx在注释中建议的细节,因为else语句中块中的return语句,速度更快。 – justhalf

相关问题