2017-04-18 10 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ブロックが実行されます。したがって、エラーがある場合は戻り値はなく、2回目のtry/exceptが実行されます。 2番目の「elseブロック」コードは常に実行されるため、エラーが発生した場合は、2回目のtry/exceptが実行される前にoutputname ERROR2で完了します。たぶんそれは起こっているかどうか見てみてください。 – jh44tx

+1

それは、ありがとう@ jh44tx – Acoustic77

答えて

-1

これは、Pythonの世界ではtry-exceptブロックが非常に一般的であり、使用するには非常に安いからです。 try-exceptは、false if文if a != 1:よりも安いです。

else節自体は興味深いです。例外がなくてもfinally節の前に実行されます。それがその主な目的です。だから、もしあなたのtry-exceptブロックがキャッチしないならば、elseステートメントはまだ動いています。これがコードを遅くする主な理由です。

else節がなければ、終了前に追加コードを実行する唯一のオプションは、コードをtry節に追加するという厄介な方法です。それは、tryブロックによって保護されないように意図されたコードの例外を発生させる危険があるため、不器用です。

ファイナライズする前に追加の保護されていないコードを実行する使用例が頻繁に発生することはありません。だから、公開されたコードで多くの例が見られるとは思わない。それはややまれです。第二版では

Look at this post for some more information

+0

どのようにこれは質問に答えますか?あなたは改善の18分が 'else'の評価自体から来ると示唆していますか? 2番目のバージョンでは 'fetchone'ブロックは常に実行されるので、最初のバージョンではそうではありませんが、2番目のバージョンでは高速です。 おそらく、jh44txがコメントに示唆したような詳細を、else文のブロック内のreturn文のためにもっと速く含めることができます。 – justhalf

関連する問題