我有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的队列库
答案 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)
我认为你可以使用多线程读取数据和队列并发队列。