数学専攻でもCS専攻でもなく、私はPython(通常はビデオゲームのシミュレーション/理論作成のためのスクリプトを作っています)を騙していて、random.randintの性能が賢明でないことを発見しました。 random.randintやrandom.randrangeがなぜ使用されているのか、どうやって作られたのか不思議です。私はrandom.randintするために同一の結果(すべての意図と実際の目的のために)を生成する機能を作った:ランダムな整数を生成するための「通常の」方法が遅いのはなぜですか?
big_bleeping_float= (2**64 - 2)/(2**64 - 2)
def fastrandint(start, stop):
return start + int(random.random() * (stop - start + big_bleeping_float))
範囲(両端を含む)の整数を生成するためにそれを使用して大規模な180%の速度向上があります0- random.randrange(0、66)と比較して、次の最も速い方法です。
>>> timeit.timeit('random.randint(0, 66)', setup='from numpy import random', number=10000)
0.03165552873121058
>>> timeit.timeit('random.randint(0, 65)', setup='import random', number=10000)
0.022374771118336412
>>> timeit.timeit('random.randrange(0, 66)', setup='import random', number=10000)
0.01937231027605435
>>> timeit.timeit('fastrandint(0, 65)', setup='import random; from fasterthanrandomrandom import fastrandint', number=10000)
0.0067909916844523755
また、random.choiceに代わるものとして、この関数の適応は、75%高速で、私は追加確信大よりオン段差私はそれをテストしていないものの、範囲は(速くなり)。あなたは、単にインラインでそれを書くことができますfastrandint機能を使用して、ほぼ倍の速度の向上のために:それは良い場合
>>> timeit.timeit('int(random.random() * (65 + big_bleeping_float))', setup='import random; big_bleeping_float= (2**64 - 2)/(2**64 - 2)', number=10000)
0.0037642723021917845
ので要約では、なぜ私は私の機能が優れていることを間違っている、なぜそれが、高速で、私がやっていることをもっと速くやり遂げる方法はありますか?
(2 ** 64 - 2)/(2 ** 64 - 2)はちょうど1ではありませんか?なぜあなたはそれを追加していますか? – cxrodgers
'random()* N'は'(0、N) 'から値を生成しintを(0、N-1)に与えるintを適用するのでbig_bleeping_floatとしてマスカレードするのが実際に必要です –
@Michael Anderson:はい、なぜ単純に1を追加しないのですか? – Julien