迭代元素列表的最有效方法。 Python 2.7

时间:2016-08-31 19:59:07

标签: python list python-2.7 loops cpython

我正在尝试迭代元素列表,但是列表可能很大并且执行时间太长。我正在使用报纸api。我构建的for循环是:

for article in list_articles:

list_articles中的每篇文章都是格式为的对象:

<newspaper.article.Article object at 0x1103e1250>

我检查了一些建议使用xrange或range,但是在我的情况下不起作用,给出了类型错误:

TypeError: 'int' object is not iterable

如果有人能指出正确的方向,或者给我一些可以有效地增加对此列表进行迭代的想法,那将是非常棒的。

2 个答案:

答案 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进行迭代是一个非常好的选择,因此您应该剖析以检查瓶颈在哪里,这可能在内部循环中(项目处理)