私には、なぜこれが起こっているのかという手がかりはありません。私はいくつかのリストを使いこなしていたので、ループは0からlog(n, 2)
になるfor
ループが必要でした。ここで、nはリストの長さです。しかし、コードは驚くほど遅かったので、ちょっとした研究の後に問題がレンジ生成にあることが分かりました。デモ用サンプルコード:0からlog(len(list)、2)の範囲を作成するのがなぜ遅いのですか?
n = len([1,2,3,4,5,6,7,8])
k = 8
timeit('range(log(n, 2))', number=2, repeat=3) # Test 1
timeit('range(log(k, 2))', number=2, repeat=3) # Test 2
出力
2 loops, best of 3: 2.2 s per loop
2 loops, best of 3: 3.46 µs per loop
テストの数は、(私はこれが10分以上を実行していることを望まなかった)低いですが、それはすでにrange(log(n, 2))
があることを示しています整数の対数だけを使用して、対応するものよりも桁違いのオーダです。これは本当に驚くべきことですが、私はなぜこれが起こっているのかについて何の手がかりも持っていません。たぶん私のPCの問題、おそらくSageの問題かPythonのバグです(私はPythonでも同じことをやっていませんでした)。
range
の代わりにxrange
を使用するとどちらも役に立ちません。また、.n()
で番号を取得した場合、テスト1は2の同じ速度で実行されます。
何が起こっているのか分かりませんか? ありがとう!
をセージ(?多分cython)問題のように聞こえます。 Pythonの 'range'は浮動小数点をとらえません。 –
また、Pythonはグローバル名前空間に 'log'を持たない(' setup'を 'timeit'に追加せずにそこに到達する方法もありません)。そして 'n 'は' timeit'にも利用できません。 'timeit'には' repeat'パラメータはありません( 'from timeit import timeit'で取得したものとみなします)。 – abarnert
あなたの出力ではなく、 'timeit'が返す値がむしろランダムであることを表示していませんか?結局、同じことを2度試してみました(nとkはともに8です)。 – Alfe