[解決済み] なぜ max は sort よりも遅いのですか?
2023-02-12 07:30:20
質問
私は、以下のことを発見しました。
max
よりも遅いです。
sort
関数より遅いです。
Python 2
$ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]'
1000 loops, best of 3: 239 usec per loop
$ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'max(a)'
1000 loops, best of 3: 342 usec per loop
パイソン3
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a.sort();a[-1]'
1000 loops, best of 3: 252 usec per loop
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'max(a)'
1000 loops, best of 3: 371 usec per loop
なぜ
は
max
(
O(n)
) よりも遅い。
sort
関数 (
O(nlogn)
)?
どのように解決するのですか?
を使用するときは、非常に注意しなければなりません。
timeit
モジュールを使うときは、非常に注意しなければなりません。
python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]'
ここでは、初期化コードを一度実行し、ランダムな配列を生成しています。
a
. その後、残りのコードが数回実行されます。最初の1回は配列をソートしますが、それ以外はすでにソートされた配列に対して sort メソッドを呼び出しています。最速の時間だけが返されるので、あなたは実際にPythonがすでにソートされた配列をソートするのにかかる時間を計っているのです。
Pythonのソートアルゴリズムの一部は、配列がすでに部分的にソートされているか、完全にソートされているかを検出することです。完全にソートされている場合、これを検出するために配列を通して一度スキャンするだけで、その後停止します。
代わりにあなたが試した場合。
python -m timeit -s 'import random;a=range(100000);random.shuffle(a)' 'sorted(a)[-1]'
を実行すると、タイミングループごとにソートが行われ、配列のソートにかかる時間は、単に最大値を求めるよりもずっと長くなることがわかります。
編集してください。
スカイキングの
答え
は、私が説明しきれなかった部分を説明してくれています。
a.sort()
はリストで作業していることを知っているので、要素に直接アクセスすることができます。
max(a)
は任意のイテラブルで動作するため、一般的な反復処理を使用する必要があります。
関連
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] 辞書をキーでソートするにはどうしたらいいですか?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] Pythonの辞書にあるスレッドセーフについて