我刚刚观察到,当使用 Python3 显式提交关键字参数的函数时,列表的改组需要大约random.shuffle
一半的运行时间。我检查了Python2是否有同样的问题,但发现它只发生在Python3上。random.random
random
我使用以下代码来测量两个版本的运行时间:
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 的相同代码查看。
根据shuffle 的文档,random.random
当我省略可选关键字参数时,默认情况下使用相同的函数random
,因此当我给它提供与默认情况下相同的生成随机数的函数时应该没有区别。
shuffle
我检查了文件夹中函数的相应来源(Python2 与 Python3),Lib/random.py
发现如果我使用关键字函数显式调用 Python3 版本,它们的行为方式相同random
。如果我省略这个参数,Python3 使用辅助函数_randbelow
,所以应该是我的问题的根源。我不明白为什么 Python3 使用它,_randbelow
因为它变慢shuffle
了。据我了解,它的好处在于生成任意大的随机数,但它不应该减慢我对少于 2^32 个元素(在我的情况下为 100000)的列表的改组。
任何人都可以向我解释为什么我在运行时看到如此不同,尽管当我使用 Python3 时它们应该更接近?
PS:请注意,我不感兴趣为什么使用 Python2 的运行时比使用 Python3 更好,但是在 Python3 中使用参数rand=rand.rand
参数与仅在 Python3 中不使用它时运行时的差异。