6

私は Python の経験があまりなく、バッファリングに関していくつかのことを理解する必要があります。

整数のリストを生成するために、一定量の「バッファ」スペースを割り当てることができるリストを生成したいと考えています(これに関する詳細はわかりません)。「バッファ」がいっぱいになったら、フラッシュコマンドが必要だと思いますか? または、そのバッファーに何かを入れ続けるには、どのようにバッファーをクリアしますか?

これが私のコードのサンプルです:

for i in range(0,500):
    randoms = random.randint(0,100000)
    looplist.append(randoms)

私が望むのは、ループリストにあり、一種のバッファになると思いますか? looplist の最大バッファ スペースがいっぱいになった場合、そのリスト/バッファに整数を再生成し続けるために、リストをクリアする必要があります (その間に一時停止がありますか? または何が起こるか)。

パート 2 の質問: Python でバッファがどのように機能するかについて簡単に説明してほしいですか? または、Pythonのメモリ管理は、独自のバッファを割り当てる必要を無効にするだけですか? (私たちもやりたいのなら、まだできますか?)

範囲が広いと思われる場合は、質問を編集し、私が知っている限り説明的になるようにします。

4

3 に答える 3

3

Python では、メモリ管理を気にする必要はありません。「バッファ」を予約する必要はありません。必要な変数を割り当てて使用するだけです。

(RAM に対して) 割り当てが多すぎると、MemoryError十分なメモリがないことを示す s が発生する可能性があります。

ただし、キューをある種のバッファとして使用することもできます。

import random
from Queue import Queue, Full

q = Queue(100)

for i in range(10):
    #fill queue
    while True:
        try:
            q.put_nowait(random.randint(1,10))
        except Full:
            break
    #take some values from queue
    print "Round", i,
    number_of_values_to_get = random.randint(0,20)
    print "getting %i values." % number_of_values_to_get
    for j in range(number_of_values_to_get):
        value = q.get()
        print "  got value", value

サイズ 100 のキューを作成します。つまり、最大 100 のエントリを格納できます。満杯のキューに入れようとすると、対応する例外が発生するため、それをキャッチすることをお勧めします。put_nowait(これは、またはタイムアウトを使用する場合にのみ True ですput。詳細については、ドキュメントを参照してください。)

この例では、10 ラウンドで、100 個のランダムな整数の「バッファー」(キュー) を埋めます。次に、このバッファから 0 ~ 20 の値を選択して出力します。

これが役立つことを願っています。キューの主な使用例は、マルチスレッド プログラムの実行であり、スレッドセーフです。そのため、あるスレッドからキューをいっぱいにして、別のスレッドからそれを読みたいと思うかもしれません。マルチスレッドが必要ない場合はcollections.deque、より高速な代替手段になる可能性がありますが、スレッドセーフではありません。

于 2013-01-28T07:08:22.920 に答える
1

キュー/リストを使用し、キュー/リストのサイズが十分に大きい場合は常に、先入れ先出し方式でインデックスをフォールオフさせます

于 2013-01-28T06:35:00.223 に答える
0

私の理解が正しければ、あなたは Python がリストのメモリを管理するかどうか尋ねています。答えはイエスです。リストにアイテムを追加し続けることができ、Python は必要に応じてリストを拡張します (もちろん、無制限に追加し続けると、メモリが不足します)。

これを制限する方法にも興味があると思いますので、リストが制限を超えないようにすることができます。その場合は、collections.dequeオブジェクトを参照することをお勧めします。

例えば:

import random
from collections import deque

def test_queue(max_size=10):
    d = deque([], max_size)
    for i in xrange(1, 2*max_size):
        r = random.randint(0, 100000)
        d.append(r)
        print 'i=%d, len=%d r=%d' % (i, len(d), r)

    while d:
        print d.popleft()

上記の関数は、作成するオブジェクトが要素dequeを超えないようにします。max_sizeにさらに要素を追加するdequeと、最も古い要素が自動的に削除されます。上記の関数の実行例を次に示します。

i=1, len=1 r=83870
i=2, len=2 r=12432
i=3, len=3 r=87084
i=4, len=4 r=3485
i=5, len=5 r=12237
i=6, len=6 r=81401
i=7, len=7 r=24990
i=8, len=8 r=21391
i=9, len=9 r=34153
i=10, len=10 r=63651
i=11, len=10 r=96305
i=12, len=10 r=46671
i=13, len=10 r=19288
i=14, len=10 r=40170
i=15, len=10 r=45399
i=16, len=10 r=94032
i=17, len=10 r=57749
i=18, len=10 r=68440
i=19, len=10 r=59726
63651
96305
46671
19288
40170
45399
94032
57749
68440
59726
于 2013-01-28T07:09:29.120 に答える