如何使循环运行更快?

时间:2016-06-24 07:43:22

标签: python performance for-loop

这是我的for循环。运行超过100,000次迭代需要很长时间。

for urlt in xrange(0, len(clean_url_data)):
    website_title.append(urlt)
    website_title[urlt]=g.extract(clean_url_data[urlt]).title
    print urlt

4 个答案:

答案 0 :(得分:1)

不是使用website_title扩展website_title.append(urlt)列表,而是立即用标题数据覆盖urlt项,您只需将标题数据直接附加到列表中即可。

此外,最好直接在clean_url_data列表上进行迭代,而不是使用整数循环来索引clean_url_data。如果您需要索引,可以使用enumerate。像这样:

website_title = []
for i, url in enumerate(clean_url_data):
    website_title.append(g.extract(url).title)
    print i

如果您真的不需要该索引,则可以使事情变得更简单。这是一种使用列表推导的方法,这比使用循环中的追加快一点。

website_title = [g.extract(url).title for url in clean_url_data]

列表推导使用一个特殊的LIST_APPEND字节码,它基本上是一个运算符,所以它比查找列表的.append方法然后调用它更快;与执行运算符相比,调用Python函数相对较慢。

答案 1 :(得分:0)

请尝试比较范围() xrange() map()def set_website_title(urlt): if urlt not in website_title: website_title.append(urlt) website_title[urlt] = g.extract(clean_url_data[urlt]).title print urlt if __name__ == "__main__": map(set_website_title, clean_url_data) 可能会花费您的时间。

img{
   display:block;
  }

答案 2 :(得分:0)

正如galaxyan所提到的,你可以使用多处理来做到这一点。以下是一个示例代码段:

boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream)

答案 3 :(得分:0)

您要将一个数字项附加到列表website_title,然后覆盖列表中相同项的值。我不明白这是多么有用。如果你不这样做,你的for循环会更快一些。

正如此测试所示:

# Your version, with append() and assignment
%%timeit
l = []
for n in xrange(100000):
    l.append(n)
    l[n] = 'something'

10个循环,最好3个循环:每个循环22.4毫秒

# Without reassignment
%%timeit
l = []
for n in xrange(100000):
    l.append('something')

100个循环,最好为3:每循环16.6 ms

# even better with list comprehension
%%timeit
l = ['something' for n in xrange(100000)]

100个循环,最好为3:每循环7.86 ms