[解決済み] Pythonは戻り値としてのみ使われる変数を最適化するのですか?
質問
次の2つのコードに究極の違いはあるか。最初のものは、関数内の変数に値を代入し、その変数を返します。2番目の関数は、単に値を直接返します。
Pythonはそれらを同等のバイトコードに変換しますか?どちらかが速いのでしょうか?
ケース1 :
def func():
a = 42
return a
ケース2 :
def func():
return 42
どのように解決するのですか?
いいえ。 それはありません .
CPythonのバイトコードへのコンパイルは、小さな ピーポーオプティマイザ これは基本的な最適化のみを行うように設計されています ( test_peepholer.py を参照してください)。
実際に何が起こっているのかを見るために
dis
* を使って、生成される命令を見てみましょう。最初の関数について、代入を含む。
from dis import dis
dis(func)
2 0 LOAD_CONST 1 (42)
2 STORE_FAST 0 (a)
3 4 LOAD_FAST 0 (a)
6 RETURN_VALUE
一方、2番目の関数については
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
1ではさらに2つの(高速)命令が使用されています。
STORE_FAST
と
LOAD_FAST
. これらは
fastlocals
配列の値を素早く保存し、取得します。次に、どちらの場合も
RETURN_VALUE
が実行されます。つまり、2番目はこれまで
わずかに
実行に必要なコマンドが少なくなるため、より速くなります。
一般に、CPythonコンパイラは 保守的 であることに注意してください。そうではなく になろうとはしません。 は、他のコンパイラ(一般に、コンパイラは作業するためにはるかに多くの情報を持っています)ほどスマートではありませんし、そうなろうともしていません。主な設計目標は、明らかに正しいことを除けば、a) シンプルであること、b) コンパイル時にできるだけ迅速に行い、コンパイル段階が存在することに気づかないようにすること、です。
結局のところ、このような小さな問題で悩むべきではありません。速度の利点は小さく、一定で、Pythonがインタプリタであるという事実によってもたらされるオーバーヘッドによって矮小化されます。
*
dis
はコードをディスアセンブルする小さな Python モジュールで、これを使うと VM が実行する Python バイトコードを見ることができます。
注意してください。 Jorn Vernee のコメントにもあるように、これは CPython による Python の実装に特有のものです。他の実装が望めば、より積極的な最適化を行うかもしれませんが、CPython では行いません。
関連
-
[解決済み] オブジェクト名の前のシングルアンダーコアとダブルアンダーコアの意味は何ですか?
-
[解決済み] Pythonでスレッドから戻り値を取得する方法は?
-
[解決済み】Python関数のグローバル変数?
-
[解決済み】ラムダ関数のクロージャは何を捕捉するのか?
-
[解決済み】Pythonジェネレータの「send」関数は何のためにあるのか?
-
[解決済み] Pythonで'try'と'if'を使い分ける
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] バブルソートの宿題
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?