[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?
2022-03-18 16:16:58
質問
def main():
for i in xrange(10**8):
pass
main()
でPythonのこのコード片が実行されます(注:タイミングはLinuxのBASHのtime関数で行っています)。
real 0m1.841s
user 0m1.828s
sys 0m0.012s
しかし、forループが関数内に配置されていない場合。
for i in xrange(10**8):
pass
とすると、もっと長い時間実行されます。
real 0m4.543s
user 0m4.524s
sys 0m0.012s
これはなぜでしょうか?
解決方法は?
という質問を受けることがあります。 なぜ は、グローバル変数よりもローカル変数を格納する方が高速です。これはCPythonの実装の詳細です。
CPythonはバイトコードにコンパイルされ、インタープリタがそれを実行することを覚えておいてください。関数がコンパイルされるとき、ローカル変数は固定サイズの配列(
ではなく
a
dict
) と変数名がインデックスに割り当てられています。これは、関数に動的にローカル変数を追加することができないから可能なのです。そうすると、ローカル変数を取り出すには、文字通りリストへのポインタ参照と
PyObject
というのは些細なことです。
これと対照的に、グローバルルックアップ (
LOAD_GLOBAL
) であり、これは真の
dict
ハッシュなどを含む検索を行います。ちなみに、このために
global i
グローバルにしたい場合:スコープ内の変数に代入すると、コンパイラは
STORE_FAST
を使用しないよう指示しない限り、そのアクセスに対して
ちなみに、グローバルルックアップは今でもかなり最適化されています。属性ルックアップ
foo.bar
は
本当に
遅いんだよ!
以下は小さなものです。 イラスト ローカル変数の効率について。
関連
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] なぜJavaでは2 * (i * i)の方が2 * i * iより速いのですか?
-
[解決済み】PyPyが6.3倍速いなら、CPythonよりPyPyを使うべきじゃないのか?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
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の非常に便利な2つのデコレーターを解説
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Python カメの描画コマンドとその例
-
Python LeNetネットワークの説明とpytorchでの実装
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].