我从一个大的旧列表中创建一个新的列表,其基础是一个不等于零的值。哪种迭代方法更快?
备选案文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]发布于 2014-12-30 19:01:21
试着同时使用timeit。
但第二是广泛使用的以速度快而闻名。
基本上,map比list comprehension快,比for loop快。
关于这个主题,网络上有很多关于的文献。
编辑:
我向承诺了一次更新,并取得了实际的、切实的结果。这是密码。
import 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循环调用函数100万次,并打印以秒为单位的时间。读它像执行这100万次,它花了xx秒。
以下是结果。我想他们是自己说话的。
~/python » python3 lists.py
Function Seconds elapsed
For loop 11.089475459069945
List comp 5.985794545034878发布于 2014-12-30 19:20:39
第二个版本速度更快,可读性更强。如果您需要更快的速度,并且只迭代结果一次,则可以使用filter - new_list = filter(lambda x: x[4] is not None, old_list)。您可以对筛选的结果调用list,但这可能没有列表理解的任何速度优势(而且比Pythonic IMHO更少)。
https://stackoverflow.com/questions/27711009
复制相似问题