在python中创建一个缓冲区

时间:2013-01-28 06:30:43

标签: python buffer

我对Python没有太多经验,需要弄清楚有关缓冲的一些事情:

我想生成一个列表,我可以在其中分配一定数量的"缓冲区" space(不知道具体内容),生成一个整数列表。如果'缓冲区'我觉得它需要一个冲洗命令?或者你如何清除缓冲区以继续将内容放入缓冲区?

以下是我的代码示例:

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

我想要的是在循环列表中,我假设是一种缓冲区?其中如果循环列表中的最大缓冲区空间变满,则需要清除(在该时间内是否有暂停?或发生的情况)该列表继续向该列表/缓冲区重新生成整数。

第2部分问题:想解释一下缓冲区如何适用于python?或者python的内存管理只是禁用需要分配自己的缓冲区? (如果我们也想,我们还可以这样做吗?)

我会编辑我的问题,如果它似乎有广泛的范围,试图像我所知的那样描述。

3 个答案:

答案 0 :(得分:1)

使用队列/列表,只要队列/列表大小足够大,就会以先进先出的方式使索引下降

答案 1 :(得分:1)

在Python中,您不必关心内存管理。您不需要保留“缓冲区”,只需分配所需的变量,然后使用它们。

如果分配的太多(对于你的RAM),你可能会遇到MemoryError s,表明你没有足够的内存。

你可以使用Queue作为某种缓冲区,例如

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_nowaitput超时,则此选项仅为True,请查看文档以获取更多详细信息。)

在这个例子中,对于十轮,我填充了100个随机整数的“缓冲区”(队列)。然后,我从这个缓冲区中选择0到20个值并打印它们。

我希望这会有所帮助。队列的主要用例是多线程程序执行,它们是线程安全的。所以也许你想要从一个线程填充队列并从另一个线程中读取它。如果您不想要多线程,collections.deque可能是更快的替代方案,但它们不是线程安全的。

答案 2 :(得分: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