自学一直有一个困扰(因为教程里不太会提及这种问题)
比如一些简单的函数或方法,如 len()
、isdigit()
多次使用的情况下
string = 'something'
if len(string) == 1:
pass
elif len(string) == 2:
pass
是否需要定义一个临时的变量
string = 'something'
length = len(string)
if len(length) == 1:
pass
elif len(length) == 2:
pass
这样变量多了一个,但是函数少计算一次
哪一种益处更大呢?
-是所有此类情况都用临时变量呢?
-还是具体函数具体分析,简单的不需要临时变量?
从资源合理利用的角度,怎么权衡这两种方案
最初に結論について話しましょう:
2 つの側面からあなたの質問に簡単に答えさせてください
まず第一に、効率が現在のプログラムの重要な核心ではない場合、読みやすさの追求が最高の原則であるべきです
何と言いますか?
一部のプログラムやコード処理の問題は、科学計算に比べて単純な課金プログラムに比べれば、たとえ実行速度の最適化を追求してもあまり意味がありません。効率的なプログラムの場合、現在注目しているコードが効率性の鍵であるとは限りません (真に判断するにはプロファイリングが必要であり、時期尚早な最適化は得策ではありません)。重要なのは、パフォーマンスに問題がなく、その原因がこのコード セグメントであると判断した場合、特にマシンのスペースと計算速度が大幅に向上した現在では、リソースやパフォーマンスを過度に考慮する必要はないということです。 、一部の関数呼び出しは何も行われません。そうでない場合、oop および一部の抽象化テクニックは使用できなくなります。
したがって、読みやすさを追求することは、一般的にはより良い目標です。もちろん、この部分は状況によって異なります。たとえば、書籍「リファクタリング」では、地域変数が原因で、Temp をクエリに置き換える方法について言及しています。コードを抽出するのが難しい。ただし、常にそうとは限りません。クエリ式が長すぎると、コードが読みにくくなる場合があります。つまり、この部分は考慮され、便宜的なものになる可能性があります。
2 番目の部分では効率を分析できます。
len
の場合、Python には組み込みのデータ構造があり、len
関数がデータ構造を直接抽出するため、別の変数を定義しないことにします。対応する C - オブジェクト内の返されたデータの長さ属性。したがって、この部分は非常に高速です。つまり、Python 自体が独自の組み込みデータの長さ情報を保存するため、len
を使用しても追加の計算は発生しません。はカスケード呼び出しであるため、効率の問題をまったく考慮する必要はありません。また、
len
は非常に読みやすく、関数の長さも非常に短いため、新しい変数を定義する必要はありません。私の理解が間違っている場合は、お気軽に修正してください、ありがとうございます
パフォーマンスを考慮すると、この状況では一時変数が必要です。一時変数をさらに使用しても問題はありません。
リーリー
まず、2 番目のバージョンではプログラムを修正します。
len()
一時変数には意味のある名前を付ける必要があります。時間計算量の概念があるかどうかはわかりませんが、一部のアルゴリズムの時間計算量は O(N) です。つまり、文字列に n 個の要素がある場合、プログラムは n 回のステップを実行する必要があります。目標は、将来このアルゴリズムを m 回使用する必要がある場合、プログラムの時間計算量は完了するまでに少なくとも n*m ステップかかることになります。
一時変数を使用してこのアルゴリズムを記録すると、値を検索する時間の計算量は O(1) だけになります。つまり、プログラムの合計の計算量は O(n*m から減少します)。 ) から O(n+m) に、
n <= m
の場合、プログラムの時間計算量は元の O(N^2) から O(N) に減少します。プログラム内の一時変数の頻度が 3 未満の場合、一時変数が多すぎると、おそらく、一時変数は必要なくなります。プログラムを再構築する場合、一時変数を使用するかどうかは主に次の考慮事項に基づいて決まります。
この問題は、一般的に、判定が 2 つしかない場合、変数を定義する必要がありません。あまりにも多くの変数を維持するのは困難です。長さに関する限り、複数の判断がある場合は、switch case を使用して len() メソッドをパラメータとして直接渡し、最も可能性の高いオプションを最初に置くことができます。私は Python を学んだことはありませんが、switch case メソッドがあるべきだと感じています。私の経験から言えば、一時変数の定義はできるだけ少なくしてください。時間が経つと、変数の管理が難しくなります。もちろん、for ループなど、一部の場所では変数が必要になります。配列の長さを格納する一時変数を定義すると、パフォーマンスが向上します。つまり、一時変数が現在のコードの可読性と保守性を大幅に向上させる場合には、すべてが現実に基づいている必要があります。それ以外の場合は定義されません。