在Python 3中,next(islice(d.values(),np.random.randint(0, len(d)-1),None))是我发现的从字典d中选择随机值的最佳方法。以下讨论对此进行了解释。
一些标准库的随机方法比可比较的numpy.random方法需要更长的运行时间。例如:
import numpy as np
timeit random.randint(0, 10)
100000 loops, best of 3: 2.52 µs per loop
timeit np.random.randint(0, 10)
1000000 loops, best of 3: 453 ns per loop
使用numpy.random.randint可以提高选择字典中随机值的方法的运行时间:
from itertools import islice
import random
d = {1:'a',2:'b',3:'c',4:'d',5:'e',6:'f',7:'g',8:'h',9:'i',10:'j'}
timeit next(islice(d.values(),random.randint(0, len(d)-1),None))
100000 loops, best of 3: 3.58 µs per loop
timeit next(islice(d.values(),np.random.randint(0, len(d)-1),None))
100000 loops, best of 3: 1.26 µs per loop
timeit d[5]
10000000 loops, best of 3: 51.3 ns per loop
def take_nth(sequence, n):
i = iter(sequence)
for _ in range(n):
next(i)
return next(i)
timeit d[take_nth(d.keys(), random.randint(0, len(d)-1))]
100000 loops, best of 3: 5.07 µs per loop
timeit d[take_nth(d.keys(), np.random.randint(0, len(d)-1))]
100000 loops, best of 3: 2.66 µs per loop
dict.keys()
并从中选择一个随机值)对你来说不够好吗? - wkldict.keys()
。我非常确定在Python 3中它需要O(n)的时间,因为dict.keys()
返回一个迭代器。我认为在Python 2中情况也不会更好,因为它可能会在内部转换字典。 - toto_tico