私はrandom.sample
を使用して、入力負荷に応じて非常に大きな範囲をサンプリングします。時には、サンプル自体が非常に大きく、リストであるため、多くのメモリを占有します。pythonはリストからリストの代わりにリスト生成器を返すためにinbuiltがあります。
アプリケーションが必ずしもリストのすべての値を使用するとは限りません。 random.sample
がリスト自体の代わりにリストジェネレータを返すことができれば嬉しいです。
今は大きな入力範囲を等しいサイズのバケットに分割するラッパーがあり、randint
を使用して各n/sample_size
バケットの乱数を選択します。
私の場合、入力は連続ですが、このラッパー関数を使ってrandom.sampleをジェネレータとしてシミュレートしましたが、最終的にいくつかの要素をスキップするため、この機能は本当に複製されません。
import random
def sample(n, k):
"""Generate random sorted k-sample of range(n)."""
for i in range(n):
if random.randrange(n - i) < k:
yield i
k -= 1
番号を通過:あなたは(私はそれがランダムでなければならないか、並べ替えることができるかどうか尋ねていた)問題ではないため、これはオプションであるかもしれないとコメントしているので
import random
def samplegen(start, end, sample_size):
bktlen = (end - start)/sample_size
for i in xrange(sample_size): #this skips the last modulo elements
st = start + (i * bktlen)
yield random.randrange(st, st + bktlen)
ジェネレータとして 'random.sample'を実行するには、すでに使用しているアイテムを追跡して、再度使用しないようにする必要があります。これは、リストを返すだけのメモリを使用します。 – kindall
@kindallだから、入力範囲をバケットに分割し、各バケットから1つの番号だけを選択し、バケットの数はサンプルサイズに基づいています。私は入力がxrange(0,1000000)のような連続した数値であることを言及すべきでした – user881300
@ user881300 'xrange(0、1000000)'の 'random.sample'はどのように問題になりますか?それは大きくありません。 –