約20,000個のオブジェクトの辞書があります。キーはオブジェクトの文字列表現であり、値はオブジェクト自体です。各オブジェクトには属性self.length
とがありますself.rate
。self.rate
として計算され1.5E-8*self.length
ます。
代わりに、レートに基づいて、このdictから事前に決定された数(この例では500と言います)のアイテムを選択する必要があります。レートが低いオブジェクトは選択される可能性が低く、レートが高いオブジェクトは選択される可能性が高くなります。
私がこれを行うことができると思った方法は非常に遅いです。
whileループでは、選択されたオブジェクトの数が必要な選択の数より少ない間、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以上はもちろん、1つのオブジェクトが選択されるまでに何度も繰り返す必要があることだと思います。
長さの分布:
Min. 1st Qu. Median Mean 3rd Qu. Max.
51 822 1311 1770 2112 103000