Python 不是很随机地从对象列表中抽样

标签 python performance algorithm

我有大约 20,000 个对象的字典键是对象的字符串表示,值是对象本身。每个对象都有属性 self.lengthself.rateself.rate 计算为 1.5E-8*self.length

我需要根据他们的比率从这个字典中选择一个预先确定的数量(在这个例子中我们会说 500)的项目,并进行替换。比率较低的对象将不太可能被选中,而比率较高的对象则更有可能被选中。

我认为我可以做到这一点的方式非常慢。

在 while 循环中,当所选对象的数量少于所需选择的数量时,我生成一个介于 0 和字典长度之间的随机数,然后选择该元素。然后我生成另一个随机数,如果该随机数小于列表中所选对象的 rate,则会将其添加到所选对象中。起初这似乎很好,但现在我意识到它太慢了。有人对如何更快地执行此操作有建议吗?

一些代码: 对象的类定义

from numpy import random
class object():
    def __init__(self, length):
        self.length  = length
        self.rate = (1.15E-8*self.length)

    def select(self):
        x = random.uniform(0,1)
        if(x<self.rate):
            return True
        else:
            return False

以及完成其余工作的函数(在另一个模块中):

def select_random(object_dict,maxselect):
    nselect = 0
    object_names = object_dict.keys()
    selected_objects = []
    while(nselect < maxselect):
        x = random.randint(0,len(object_dict))
        if(object_dict[object_names[x]].select()):
            nselect +=1
            selected_objects.append(object_names[x])
    return(selected_objects)

我认为真正让它变慢的原因是每个对象被选中的概率太小,甚至在选择一个对象之前都需要多次迭代,更不用说 500 次或更多次了。

长度分布:

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     51     822    1311    1770    2112  103000 

最佳答案

试试这个:

import numpy as np    # requires NumPy 1.7 (!)

def select_random(object_dict, n):
    keys = object_dict.keys()
    rate = np.array([x.rate for x in keys])
    prob = rate / rate.sum()
    return np.random.choice(keys, size=n, replace=True, p=prob)

( Documentation )

P.S.,调用类 object 是个坏主意,因为它也是内置通用基类的名称。

关于Python 不是很随机地从对象列表中抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757938/

相关文章:

python - 在 Python3 的递归函数中使用 print()

python - 机器学习鸡尾酒会音频应用

java - Java 中的哪个 API 用于文件读取以获得最佳性能?

algorithm - 正整数和负整数的子集和

algorithm - 在未排序的只读数据结构中找到没有多余空间的第 n 大元素

python - 使用python在sqlite3中附加数据库

python - SQLAlchemy 一对一关系创建多行

performance - CSS3 过渡或高内存对象是否有可能影响 Chrome 中的滚动平滑度?

linux - Eclipse makefile 构建速度很慢......是什么原因造成的?

c++ - 哪个算法需要 "visitor"(boost 库中的术语)?