python - 集合中的快速随机元素 - Python

标签 python performance random

我正在寻找一种从大型 Python 集合中随机抽取单个元素的更快方法。下面我对三个明显的例子进行了基准测试。有更快的方法吗?

import random
import time

test_set = set(["".join(["elem-", str(l)]) for l in range(0, 1000000)])

t0 = time.time()
random_element = random.choice(list(test_set))
print(time.time() - t0)

t0 = time.time()
random_element = random.sample(test_set, 1)
print(time.time() - t0)

t0 = time.time()
rand_idx = random.randrange(0, len(test_set)-1)
random_element = list(test_set)[rand_idx]
print(time.time() - t0)

输出:

0.0692291259765625
0.06741929054260254
0.07094502449035645

最佳答案

您可以使用 numpy 并将其添加到您的基准测试中。

import numpy
random_num = numpy.randit(0, 1000000)
element = 'elem-' + str(random_num)
test_array = numpy.array([x for x in test_set])

具体来说,这是一段对不同方法进行基准测试的代码:

random_choice_times = []
random_sample_times = []
random_randrange_times = []
numpy_choince_times = []
for i in range(0,10):
    t0 = time.time()
    random_element = random.choice(list(test_set))
    time_elps = time.time() - t0
    random_choice_times.append(time_elps)

    t0 = time.time()
    random_element = random.sample(test_set, 1)
    time_elps = time.time() - t0
    random_sample_times.append(time_elps)


    t0 = time.time()
    rand_idx = random.randrange(0, len(test_set)-1)
    random_element = list(test_set)[rand_idx]
    time_elps = time.time() - t0
    random_randrange_times.append(time_elps)

    t0 = time.time()
    random_num = numpy.random.choice(numpy.array(test_array))
    time_elps = time.time() - t0
    numpy_choince_times.append(time_elps)


print("Avg time for random.choice: ", sum(random_choice_times) /10)
print("Avg time for random.sample: ", sum(random_sample_times) /10)
print("Avg time for random.randrange: ", sum(random_randrange_times) /10)
print("Avg time for numpy.choice: ", sum(numpy_choince_times) /10)

这是时间

>>> Avg time for random.choice:  0.06497154235839844
>>> Avg time for random.sample:  0.06054067611694336
>>> Avg time for random.randrange:  0.05938301086425781
>>> Avg time for numpy.choice:  0.017636775970458984

关于python - 集合中的快速随机元素 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44971617/

相关文章:

python - 如何在第一次单击鼠标时选择一个 Sprite ,然后在第二次单击鼠标的位置创建一个新 Sprite

css - 最佳实践 - 只下载您需要的 CSS,还是使用缩小过程?

c - C 中 0 和 1 [0, 1) 之间的归一化随机数分布

c# - 从目录中选择随机文件

python - 回车不保持新的光标位置

python - 交换numpy数组中的列?

python - 如何将数据框转换为工作表(Python 3.8)?

linux - 在运行网络服务器或数据库的 Linux 服务器上应该监视哪些资源

python - 是否有带有 python 绑定(bind)的最新快速 YAML 解析器?

arrays - 随机化两个值之间的矩阵元素,同时保持行和列总和固定 (MATLAB)