我对Python没有太多经验,需要弄清楚有关缓冲的一些事情:
我想生成一个列表,我可以在其中分配一定数量的"缓冲区" space(不知道具体内容),生成一个整数列表。如果'缓冲区'我觉得它需要一个冲洗命令?或者你如何清除缓冲区以继续将内容放入缓冲区?
以下是我的代码示例:
for i in range(0,500):
randoms = random.randint(0,100000)
looplist.append(randoms)
我想要的是在循环列表中,我假设是一种缓冲区?其中如果循环列表中的最大缓冲区空间变满,则需要清除(在该时间内是否有暂停?或发生的情况)该列表继续向该列表/缓冲区重新生成整数。
第2部分问题:想解释一下缓冲区如何适用于python?或者python的内存管理只是禁用需要分配自己的缓冲区? (如果我们也想,我们还可以这样做吗?)
我会编辑我的问题,如果它似乎有广泛的范围,试图像我所知的那样描述。
答案 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_nowait
或put
超时,则此选项仅为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