10

固定サイズのセットからランダムにランダムに数値をサンプリングし、計算を行って、新しい数値をセットに戻す必要があります。(必要なサンプル数は非常に多いです)

番号をリストに保存し、random.choice()を使用して要素を選択し、削除してから、新しい要素を追加しようとしました。しかし、それは遅すぎます!

数値をnumpy配列に格納し、インデックスのリストをサンプリングして、インデックスごとに計算を実行することを考えています。

  • このプロセスを実行するより速い方法はありますか?
4

3 に答える 3

7

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

于 2011-10-19T00:42:55.883 に答える
4

固定サイズのセットからランダムにランダムに数値をサンプリングし、計算を行って、新しい数値をセットに戻す必要があります。

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
于 2011-10-19T05:44:21.977 に答える
2

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 はどれくらいですか?

于 2011-10-21T09:47:45.840 に答える