とのif
ステートメントがあるとしreturn
ます。効率の観点から、私は使用する必要があります
if(A > B):
return A+1
return A-1
または
if(A > B):
return A+1
else:
return A-1
コンパイルされた言語(C)またはスクリプト化された言語(Python)を使用するとき、どちらを好むべきですか?
とのif
ステートメントがあるとしreturn
ます。効率の観点から、私は使用する必要があります
if(A > B):
return A+1
return A-1
または
if(A > B):
return A+1
else:
return A-1
コンパイルされた言語(C)またはスクリプト化された言語(Python)を使用するとき、どちらを好むべきですか?
回答:
return
ステートメントは現在の関数の実行を終了するため、2つの形式は同等です(ただし、2番目の形式は最初の形式よりも間違いなく読みやすくなっています)。
両方の形式の効率は同等であり、if
いずれにしても条件がfalseの場合、基になるマシンコードはジャンプを実行する必要があります。
Pythonは、return
あなたのケースで1つのステートメントだけを使用できる構文をサポートしていることに注意してください:
return A+1 if A > B else A-1
return (A>B)?A+1:A-1;
ただし、このようなコードを記述しても、パフォーマンスはまったく向上しません。私たちが達成したことは、コードを難読化し、判読不能にし、場合によっては暗黙的な型の昇格に対して脆弱にすることです。
<
ので、悪い習慣-1 < 1u
です。
-1 < 1u
、それは疑わしいですが、バグを簡単に見つけることができます。かなり多くの人が私が投稿したコードのいくつかのバージョンを書くでしょう。?:演算子を信頼できないほど、本番用コードでそのようなバグを頻繁に見ました。また、経験則として、同じことを行うために2つの異なる方法が言語で提供されている場合は、どちらか一方のみを使用し、気分に応じてどちらかをランダムに選択しないでください。
以下からのクロムのスタイルガイド:
返品後は他の物を使わないでください:
# Bad
if (foo)
return 1
else
return 2
# Good
if (foo)
return 1
return 2
return 1 if foo else 2
if-else-return
ブランチがほとんど等しくないことがわかります(等しい場合は、とにかくリファクタリングする必要があります。switch
構成を使用するか、Pythonの場合は、dictを列挙する/呼び出し可能オブジェクトを使用するなど)。したがって、ほとんどすべてif-else-return
がガード節のケースであり、それらは常になしでテスト可能です(テストされた式を模擬します)else
。
コーディングスタイルについて:
言語に関係なく、ほとんどのコーディング標準は、単一の関数からの複数のreturnステートメントを悪い習慣として禁止しています。
(個人的には、複数のreturnステートメントが理にかなっている場合がいくつかあると思いますが、テキスト/データプロトコルパーサー、広範なエラー処理機能など)
これらすべての業界コーディング標準のコンセンサスは、式は次のように記述する必要があるということです。
int result;
if(A > B)
{
result = A+1;
}
else
{
result = A-1;
}
return result;
効率について:
上記の例と問題の2つの例は、効率の点ですべて完全に同等です。これらすべての場合のマシンコードは、A> Bを比較し、A + 1またはA-1の計算に分岐し、その結果をCPUレジスタまたはスタックに格納する必要があります。
編集:
出典:
return
。Pythonでそれを行うための慣用的な方法は、明確にどこにでも置くことです。
賢明なコンパイラーであれば、違いはありません。それらは同等なので、同じマシンコードにコンパイルする必要があります。
インタプリタは気にしないので、これはスタイル(または好み)の問題です。個人的には、関数ベース以外のインデントレベルで値を返す関数の最後のステートメントを作成しないようにします。例1のelseは、関数の終わりがわずかな場合であっても覆い隠します。
好みで私は使用します:
return A+1 if (A > B) else A-1
これは、関数の最後のステートメントとして単一のreturnステートメントを使用するという優れた規則(前述のとおり)と、命令型の中間結果を回避するための優れた関数型プログラミングパラダイムの両方に従うためです。
より複雑な関数の場合は、可能であれば早すぎる戻りを避けるために、関数を複数のサブ関数に分割することを好みます。それ以外の場合は、rvalと呼ばれる命令型変数の使用に戻ります。関数が些細な場合や、終了前のreturnステートメントがエラーの結果でない限り、複数のreturnステートメントを使用しないようにしています。時期尚早に戻ると、先に進むことができないという事実が強調されます。複数のサブ関数に分岐するように設計された複雑な関数の場合、それらをcaseステートメント(たとえば、dictによって駆動される)としてコーディングしようとします。
一部のポスターは、操作の速度について言及しています。実行速度が必要な場合、Pythonは使用するのに最適な言語ではないため、実行速度は二次的なものです。私が重要なコーディング(つまり、エラーのないコードを書く)の効率としてPythonを使用しています。
var n = 1 if (A > B) else -1
return A+n
個人的else
には可能な限りブロックを避けます。参照してくださいアンチ場合はキャンペーン
また、彼らはラインのために「余分な」料金を請求しません、あなたは知っています:p
「シンプルは複雑よりも優れている」と「読みやすさが重要」
delta = 1 if (A > B) else -1
return A + delta
dict
sを使用してdiffを回避することは、パフォーマンスの点で非常に悪い考えです。