Python迭代哪种方法更快?

时间:2014-12-30 18:59:25

标签: python python-2.7

我正在根据某个值不等于None的大型旧列表创建一个新列表。哪种迭代方法更快?

选项1:

new_list = []
for values in old_list:
   if values[4] is not None:
       new_list.append(values[4])

选项2:

new_list = [x for x in old_list if x[4] is not None]

2 个答案:

答案 0 :(得分:5)

尝试timeit两者。

但第二个广泛known to be faster

基本上maplist comprehension更快,for loopimport random import timeit old_list = [ random.randint(0, 100000) for i in range(0, 100) ] def floop(old_list): new_list = [] for value in old_list: new_list.append(value) return new_list def lcomp(old_list): new_list = [ value for value in old_list ] return new_list if __name__=='__main__': results_floop = timeit.Timer('floop(old_list)', "from __main__ import floop, old_list").timeit() results_lcomp = timeit.Timer('lcomp(old_list)', "from __main__ import lcomp, old_list").timeit() print("Function\t\tSeconds elapsed") print("For loop\t\t{}".format(results_floop)) print("List comp\t\t{}".format(results_lcomp)) 快。

网上有关于此主题的整批文献。

修改

承诺更新实际,切实的结果。这是代码。

timeit

请记住:~/python » python3 lists.py Function Seconds elapsed For loop 11.089475459069945 List comp 5.985794545034878 遍历被调用的函数100万次,并以秒为单位打印经过的时间。像一样读它来执行这一百万次,花了xx秒

以下是结果。我认为他们自己说话。

{{1}}

答案 1 :(得分:1)

第二个是更快,更可读。如果您需要更快的速度,并且只迭代结果一次,则可以使用filter - new_list = filter(lambda x: x[4] is not None, old_list)。你可以在过滤后的结果上调用list,但这可能没有比列表理解更快的速度优势(并且更少Pythonic恕我直言)。