Python - 迭代大型列表并放入队列

时间:2011-12-05 03:30:14

标签: python list iteration

我有for循环代码:

people = queue.Queue()
for person in set(list_):
    first_name,last_name = re.split(',| | ',person)
    people.put([first_name,last_name])

正在迭代的列表有1,000,000个项目,它可以工作,但需要几秒钟才能完成。

我可以做些什么改变来帮助处理速度?

编辑:我应该补充说这是Gevent的队列库

4 个答案:

答案 0 :(得分:1)

问题是你的队列用途是什么?如果在这种情况下不需要进行线程处理(或者你可以解决线程访问),你想切换到生成器 - 你可以把它们看作是Unix shell管道的Python版本。所以,你的循环看起来像:

def generate_people(list_):
    previous_row = None
    for person in sorted(list_):
        if person == previous_row:
            continue
        first_name,last_name = re.split(',| | ',person)
        yield [first_name,last_name]
        previous_row = person

你会像这样使用这个生成器:

for first_name, last_name in generate_people():
    print first_name, last_name

这种方法避免了可能是你最大的性能命中 - 分配内存来构建一个队列和一个包含1,000,000多个项目的集合。这种方法一次只能使用一对字符串。

<强>更新

基于有关线程如何在其中发挥作用的更多信息,我将使用此解决方案。

people = queue.Queue()
previous_row = None
for person in sorted(list_):
    if person == previous_row:
        continue
    first_name,last_name = re.split(',| | ',person)
    people.put([first_name,last_name])
    previous_row = person

这将使用更高效的东西替换set()操作。

答案 1 :(得分:1)

with people.mutex:
    people.queue.extend(list(re.split(',| | ',person)) for person in set(list_))
    people.not_empty.notify_all()

请注意,这完全忽略了队列容量,但避免了大量过度锁定。

答案 2 :(得分:0)

我会尝试用不那么强烈的东西替换正则表达式:

first_name, last_name = person.split(', ')

答案 3 :(得分:0)

我认为你可以使用多线程读取数据和队列并发队列。