迭代元素列表的最有效方法。 Python 2.7
The most efficient way to iterate over a list of elements. Python 2.7
我正在尝试遍历元素列表,但是该列表可能很大并且执行时间太长。我正在使用报纸 api。我构造的for循环是:
for article in list_articles:
list_articles中的每篇文章都是一个对象,格式为:
<newspaper.article.Article object at 0x1103e1250>
我检查了一些建议使用 xrange 或 range,但是在我的情况下这不起作用,给出了类型错误:
TypeError: 'int' object is not iterable
如果有人能指出正确的方向或给我一些可以有效地增加对该列表的迭代的想法,那就太棒了。
这里有一个让问题更有趣的小基准:
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
进行迭代是一个很好的选择,所以你应该分析一下瓶颈在哪里,这可能是在内部循环(项目处理)
最好的方法是尽可能使用内置函数,例如拆分字符串、连接字符串、分组等的函数...
有列表理解或 map
可能的话。如果您需要通过操作每个元素从另一个列表构建一个列表,那么就是这样。
解渴最好的方法是 for item in items
循环。
已添加
让你成为 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)
现在打印和第一个例子有点不一样,但很多时候,没关系,甚至更好,而且还可以用一行代码转换成你需要的。
我正在尝试遍历元素列表,但是该列表可能很大并且执行时间太长。我正在使用报纸 api。我构造的for循环是:
for article in list_articles:
list_articles中的每篇文章都是一个对象,格式为:
<newspaper.article.Article object at 0x1103e1250>
我检查了一些建议使用 xrange 或 range,但是在我的情况下这不起作用,给出了类型错误:
TypeError: 'int' object is not iterable
如果有人能指出正确的方向或给我一些可以有效地增加对该列表的迭代的想法,那就太棒了。
这里有一个让问题更有趣的小基准:
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
进行迭代是一个很好的选择,所以你应该分析一下瓶颈在哪里,这可能是在内部循环(项目处理)
最好的方法是尽可能使用内置函数,例如拆分字符串、连接字符串、分组等的函数...
有列表理解或 map
可能的话。如果您需要通过操作每个元素从另一个列表构建一个列表,那么就是这样。
解渴最好的方法是 for item in items
循环。
已添加
让你成为 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)
现在打印和第一个例子有点不一样,但很多时候,没关系,甚至更好,而且还可以用一行代码转换成你需要的。