我正在尝试迭代元素列表,但是列表可能很大并且执行时间太长。我正在使用报纸api。我构建的for循环是:
for article in list_articles:
list_articles中的每篇文章都是格式为的对象:
<newspaper.article.Article object at 0x1103e1250>
我检查了一些建议使用xrange或range,但是在我的情况下不起作用,给出了类型错误:
TypeError: 'int' object is not iterable
如果有人能指出正确的方向,或者给我一些可以有效地增加对此列表进行迭代的想法,那将是非常棒的。
答案 0 :(得分:2)
最好的方法是尽可能使用内置函数,例如分割字符串,连接字符串,分组等功能......
有可能的列表理解或map
。如果你需要通过操纵每个元素来构建另一个列表,那就是它。
口渴最好的方法是for item in items
循环。
<强> ADDED 强>
让你成为Python程序员,一个更好的程序员,让你进入下一级编程的一件事是我提到的第二件事 - 列表理解和地图。很多时候,您只是迭代一个列表来构造一些可以通过列表理解轻松完成的事情。例如:
new_items = []
for item in items:
if item > 3:
print(item * 10)
new_items.append(item * 10)
你可以做得更好(更短,更快,更健壮),如下所示:
new_items = [item * 10 for item in items if item > 3]
print(items)
现在,打印与第一个示例略有不同,但通常情况下,它并不重要,甚至更好,也可以通过一行代码转换为您需要的内容。 / p>
答案 1 :(得分:0)
这里有一个基准来让这个问题更有趣:
import timeit
import random
N = 1000000
class Foo:
def __init__(self):
self.n = random.randint(0, 1000)
bar = [Foo() for r in xrange(N)]
def f1(lst):
return [v for v in lst]
def f2(lst):
return [v for index, v in enumerate(lst)]
def f3(lst):
return [lst[i] for i in range(len(lst))]
K = 100
print timeit.timeit('f1(bar)', setup='from __main__ import f1, bar', number=K)
print timeit.timeit('f2(bar)', setup='from __main__ import f2, bar', number=K)
print timeit.timeit('f3(bar)', setup='from __main__ import f3, bar', number=K)
在我的机器中给出:
5.1150355947
6.89524135475
7.90469366922
[Finished in 22.1s]
结论:使用成语for v in huge_list
进行迭代是一个非常好的选择,因此您应该剖析以检查瓶颈在哪里,这可能在内部循环中(项目处理)