Python3を使用する場合、キーワード引数random.shuffle
の関数を明示的に送信すると、実行時間が約半分になるリストのシャッフルが必要になることに気付きました。Python2にも同じ問題があるかどうかを確認しましたが、Python3でのみ発生することがわかりました。random.random
random
次のコードを使用して、2つのバージョンの実行時間を測定します。
from timeit import Timer
t1 = Timer("random.shuffle(l)", "import random; l = list(range(100000))")
t2 = Timer("random.shuffle(l, random = random.random)", "import random; l = list(range(100000))")
print("With default rand: %s" % t1.repeat(10,1))
print("With custom rand: %s" % t2.repeat(10,1))
ideoneでテストケースを作成し、Python3と同じコードをPython2で確認できるようにしました。
シャッフルのドキュメントによるとrandom.random
、オプションのキーワード引数を省略した場合、デフォルトの場合と同じ関数が使用されるため、デフォルトの場合random
と同じ関数を使用して乱数を生成しても違いはありません。
shuffle
フォルダ内の関数のそれぞれのソース(Python2とPython3)を確認したところ、キーワードの関数を使用してPython3バージョンを明示的に呼び出すとLib/random.py
、同じように動作することがわかりましたrandom
。この引数を省略すると、Python3はヘルパー関数を使用する_randbelow
ため、問題の原因が存在するはずです。_randbelow
速度が低下するため、Python3がなぜ使用するのかわかりませんshuffle
。私が理解している限り、その利点は任意の大きな乱数を生成することにありますが、2 ^ 32要素(私の場合は100000)よりもはるかに少ないリストのシャッフルを遅くすることはありません。
Python3を使用すると、ランタイムがより近くなるはずなのに、なぜランタイムにこのような違いが見られるのか、誰かに説明してもらえますか?
PS:Python2でのランタイムがPython3よりも優れている理由には興味がないことに注意してください。ただし、Python3で引数rand=rand.rand
引数を使用する場合とPython3のみで使用しない場合のランタイムの違いです。