固定サイズのセットからランダムにランダムに数値をサンプリングし、計算を行って、新しい数値をセットに戻す必要があります。(必要なサンプル数は非常に多いです)
番号をリストに保存し、random.choice()を使用して要素を選択し、削除してから、新しい要素を追加しようとしました。しかし、それは遅すぎます!
数値をnumpy配列に格納し、インデックスのリストをサンプリングして、インデックスごとに計算を実行することを考えています。
- このプロセスを実行するより速い方法はありますか?
固定サイズのセットからランダムにランダムに数値をサンプリングし、計算を行って、新しい数値をセットに戻す必要があります。(必要なサンプル数は非常に多いです)
番号をリストに保存し、random.choice()を使用して要素を選択し、削除してから、新しい要素を追加しようとしました。しかし、それは遅すぎます!
数値をnumpy配列に格納し、インデックスのリストをサンプリングして、インデックスごとに計算を実行することを考えています。
PythonArrayList
のリストは (Java や C++std::vector
などのように) 配列として内部的に実装されているため、途中から要素を削除するのは比較的遅くなります。後続のすべての要素のインデックスを再作成する必要があります。(詳細については、 http://www.laurentluce.com/posts/python-list-implementation/を参照してください。) 要素の順序は関係ないように思われるので、使用random.randint(0, len(L) - 1)
して選択することをお勧めします。 index i
、次に使用してth 要素L[i] = calculation(L[i])
を更新します。i
固定サイズのセットからランダムにランダムに数値をサンプリングし、計算を行って、新しい数値をセットに戻す必要があります。
s = list(someset) # store the set as a list
while 1:
i = randrange(len(s)) # choose a random element
x = s[i]
y = your_calculation(x) # do some calculation
s[i] = y # put the new number back into the set
random .sample( a set or list or Numpy array, Nsample ) は非常に高速ですが、次のようなものが必要かどうかはわかりません。
import random
Setsize = 10000
Samplesize = 100
Max = 1 << 20
bigset = set( random.sample( xrange(Max), Setsize )) # initial subset of 0 .. Max
def calc( aset ):
return set( x + 1 for x in aset ) # << your code here
# sample, calc a new subset of bigset, add it --
for iter in range(3):
asample = random.sample( bigset, Samplesize )
newset = calc( asample ) # new subset of 0 .. Max
bigset |= newset
の代わりにNumpy 配列またはbitarrayset
を使用できますが、 calc() での時間が支配的であると予想されます。
おおよその Setsize と Samplesize はどれくらいですか?