[解決済み】リスト変換や関数型は「forループ」よりも速い?
質問
Pythonのパフォーマンスという点では、リストコンプリヘンション、または、以下のような関数は有効でしょうか?
map()
,
filter()
と
reduce()
forループより速い?なぜかというと、技術的には、それらは
Cのスピードで走る
, while
forループはPython仮想マシンの速度で実行されます。
?.
私が開発しているゲームで、複雑で巨大なマップをforループで描画する必要があるとします。この質問は間違いなく関連性があります。例えば、リスト内包が本当に高速であれば、(コードの視覚的複雑さにもかかわらず)遅延を避けるためにはるかに良い選択肢となるでしょう。
どのように解決するのか?
以下は、経験則に基づく大まかなガイドラインと推測です。あなたは
timeit
また、具体的なユースケースをプロファイリングすることで、正確な数値を得ることができます。
リスト内包は、通常、正確に等価である
for
ループ(実際にリストを作成するループ)は、リストとその中の
append
メソッドを繰り返し実行します。しかし、リスト内包はバイトコードレベルのループを行うことに変わりはありません。
>>> dis.dis(<the code object for `[x for x in range(10)]`>)
1 0 BUILD_LIST 0
3 LOAD_FAST 0 (.0)
>> 6 FOR_ITER 12 (to 21)
9 STORE_FAST 1 (x)
12 LOAD_FAST 1 (x)
15 LIST_APPEND 2
18 JUMP_ABSOLUTE 6
>> 21 RETURN_VALUE
というループの代わりにリスト内包を使用する。 はありません。 を構築し、無意味に値のリストを蓄積し、そのリストを捨てることはよくあることです。 遅くなる なぜなら、リストを作成し、拡張するためのオーバーヘッドがあるからです。リスト内包は、古き良きループより本質的に高速な魔法ではないのです。
関数型リスト処理関数については。これらはC言語で書かれており、おそらくPythonで書かれた同等の関数を凌駕していますが
ではなく
必ずしも最速のオプションではありません。ある程度のスピードアップが期待できる
もし
この関数もCで書かれています。しかし、ほとんどの場合
lambda
(または他のPython関数)の場合、Pythonのスタックフレームを繰り返し設定するオーバーヘッドが、節約分を食いつぶしてしまうのです。同じ作業を関数呼び出しなしにインラインで行うだけで、(例えば、リスト内包を
map
または
filter
)の方が若干速いことが多い。
例えば、私が開発しているゲームで、複雑で巨大なマップをforループで描画する必要があるとします。この質問は間違いなく関連性があります。例えば、リストコンパージョンが本当に高速であれば、(コードの視覚的な複雑さにもかかわらず)遅延を避けるために、より良い選択肢となるでしょう。
このようなコードは、非"最適化" Pythonで書かれたときにすでに十分に速くない場合、Pythonレベルのマイクロ最適化をいくら行っても十分に速くならないので、Cに落とすことを考え始める必要があります。さらに、その限界に達する前であっても、その弾丸を食い止め、いくつかのCを書く方が単純にコスト効率が良くなります(同じ努力で15%のスピードアップと300%のスピードアップ)。
関連
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] なぜ[]はlist()よりも速いのですか?
-
[解決済み] なぜpythonはforやwhileループの後に'else'を使うのですか?
-
[解決済み] FORループとIF文の組み合わせのPythonicな方法
-
[解決済み】ループは本当に逆回転で速くなるのか?
最新
-
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 カメの描画コマンドとその例
-
python implement mysql add delete check change サンプルコード
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Python入門 openを使ったファイルの読み書きの方法
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み】ValueError: xとyは同じサイズでなければならない