我有大约 20,000 个对象的字典键是对象的字符串表示形式,值是对象本身。每个对象都有属性self.length
和self.rate
。self.rate
计算为1.5E-8*self.length
。
我需要根据他们的费率从这个字典中选择一个预定数量的项目(在这个例子中我们会说 500 个)。具有较低比率的对象不太可能被选择,而具有较高比率的对象更有可能被选中。
我认为我可以做到这一点的方式非常缓慢。
在一段时间内,虽然所选对象的数量小于所需选择的数量,但我在0和dict和选择该元素的长度之间生成一个随机数。然后我生成另一个随机数,如果随机数小于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