2

解決策:Pythonは設定時に変数の値を計算し、変数は単なるポインターです。実行時の唯一の違いは、Pythonが値をバイナリストアに変換するのにかかる時間(最小)であるため、最初のオプションの方が明確にするために優れていると思います。

返信してくれたすべての人に感謝します。

書いているモジュールでは、単純なオン/オフスイッチの定数をたくさん定義する必要があります。これは明らかにバイナリ文字列として簡単に実行できますが、定数を定義すると、以下のどのメソッドが実行時の速度と実行時のメモリ使用に与える影響が少なくなります。

1:

THIS_VAR_0 = 2**0
THIS_VAR_1 = 2**1
.
.
.
This_Var_N = 2**N

または、2つ:

THIS_VAR_0 = 0
THIS_VAR_1 = 1
.
.
.
This_Var_N = 536870912 # 2**30

編集:それらは複数回計算する必要はありません。Pythonにはネイティブの読み取り専用定数がない場合がありますが、これらのような定数を使用するようにコードのこのセクションを作成しています。(、と同じアイデアwx.ID_ANY、およびwx.DEFAULT_FRAMEタイプのもの)

別の言い方をすれば、次のようになります。変数が最初に検出され(設定され)、次にポインターがルックアップに使用されるときに計算が実行されますか、それとも数式を指すポインターと数式が変数に遭遇するたびに計算されますか?

注:Python 2.7に基づくこの情報が必要ですが、Python 3.Xに対する応答(同じでない場合)もいただければ幸いです。回答が2または3のいずれかにのみ当てはまる場合は、そのように言ってください。(私はまだ3を掘り下げていませんが、将来の使用知​​識も良いので、それを計画しています;-)

4

4 に答える 4

2

リセットしない限り、どちらの方法でも一度だけ評価されます。評価を使用して計算を行う場合は、計算に対して 1 回のヒットを支払うことになりますが、最初の読み取りの後は同じになります。

毎回評価したい場合は、ラムダに置き換えることができますが、中かっこで呼び出す必要があります。

pi = lambda : 3.14159265359
two_pi = lambda : 2 * pi()

around = two_pi() * r # note braces

FWIW Python には、読み取り専用の変数を作成するネイティブな方法がないため、ここでの「定数」は慣例であり、基本的な真実ではありません。

于 2013-01-02T03:45:38.993 に答える
1

Pythonは定数畳み込みを行います。

>>> import dis
>>> def function():
...     return 2**21
... 
>>> dis.disassemble(function.__code__)
  2           0 LOAD_CONST               3 (2097152) 
              3 RETURN_VALUE         

モジュールがコンパイルされると、との間には何の違いもありませ2**212097152

于 2013-01-02T04:44:45.670 に答える
1

Pythonは設定時に変数の値を計算し、変数は単なるポインターです。実行時の唯一の違いは、Pythonが値をバイナリストアに変換するのにかかる時間(最小)であるため、最初のオプションの方が明確にするために優れていると思います。

これは一般的なPythonです。

また、たくさんの定数を定義する必要があると言うので、forループとdictを使用しないのはなぜですか。

THIS_VAR = {}
for i in range(n):
    THIS_VAR[i] = 2 ** i

次に、THIS_VAR[i]を介して値にアクセスできます。すべての定数を手動で定義するよりもはるかに高速です。

于 2013-01-02T03:39:29.297 に答える
0

演算子を使用するよりもわずかに効率的である**か、使用できる可能性があります。次に、コードを次のように置き換えることができます。pow()<<

THIS_VAR_0 = 1<<0             # equal to 2**0; actually, it is 1
THIS_VAR_1 = 1<<1             # 2 
...
This_Var_N = 1<<N             # 2**N

Python3のドキュメントには次のように書かれています。

nビットの左シフトは、オーバーフローチェックなしのpow(2、n)による乗算と同等です。

Python 2.7の場合、ドキュメントの同じセクションに次のように記載されています。

nビットの左シフトは、pow(2、n)による乗算と同等です。結果が単純な整数の範囲を超える場合、長整数が返されます。

...つまり、オーバーフローチェックについては言及されていません。とにかく、Pythonの両方のバージョンで同じ結果が得られます。

シフト演算子は、Cファミリ言語のような定数を定義するためにより自然です。プロセッサのネイティブ整数の操作は非常に高速です。とにかく、最も効率的であるはずの明示的な数字の場合も使用するのが非常に一般的です。(本当にそうならtimeit、結果を投稿してください。)説明がないと、読みにくく、理解しにくいだけです。とにかく、シフト演算子を使用してコメントを追加できます。

THIS_VAR_0 = 0               # default
THIS_VAR_1 = 1               # 1 << 0
...
This_Var_N = 536870912       # 1 << 30

注意:質問にバグがあります。ゼロにする必要がある場合THIS_VAR_0、として生成することはできません2**0

于 2013-01-02T23:04:47.923 に答える