在python中创建列表的最佳和/或最快方法

在python中,据我所知,至少有3到4种方法来创建和初始化给定大小的列表:

简单循环append

my_list = [] for i in range(50): my_list.append(0)

简单循环+=

my_list = [] for i in range(50): my_list += [0]

列表理解:

my_list = [0 for i in range(50)]

列表和整数乘法:

my_list = [0] * 50

在这些例子中,我认为只有列表只有50个元素会有任何性能差异,但如果我需要一个包含一百万个元素的列表呢?使用xrange会有什么改进吗?哪个是在python中创建和初始化列表的首选/最快方法?

 

解决方案

让我们运行一些时间测试* timeit.timeit

>>> from timeit import timeit >>> >>> # Test 1 >>> test = """ ... my_list = [] ... for i in xrange(50): ... my_list.append(0) ... """ >>> timeit(test) 22.384258893239178 >>> >>> # Test 2 >>> test = """ ... my_list = [] ... for i in xrange(50): ... my_list += [0] ... """ >>> timeit(test) 34.494779364416445 >>> >>> # Test 3 >>> test = "my_list = [0 for i in xrange(50)]" >>> timeit(test) 9.490926919482774 >>> >>> # Test 4 >>> test = "my_list = [0] * 50" >>> timeit(test) 1.5340533503559755 >>>

如您所见,最后一种方法是迄今为止最快的方法。

但是,它应该用一成不变的物品(如整数)使用。这是因为它将创建一个列表,其中包含对同一项的引用。

以下是演示:

>>> lst = [[]] * 3 >>> lst [[], [], []] >>> # The ids of the items in `lst` are the same >>> id(lst[0]) 28734408 >>> id(lst[1]) 28734408 >>> id(lst[2]) 28734408 >>>

这种行为通常是不受欢迎的,并且可能导致代码中的错误。

如果你有可变项(例如列表),那么你应该使用仍然非常快的列表理解:

>>> lst = [[] for _ in xrange(3)] >>> lst [[], [], []] >>> # The ids of the items in `lst` are different >>> id(lst[0]) 28796688 >>> id(lst[1]) 28796648 >>> id(lst[2]) 28736168 >>>

*注意:在所有测试中,我替换rangexrange由于后者返回迭代器,因此它应该总是比前者快。

 

本文首发于Python黑洞网,博客园同步更新

 

    原文作者:python之蝉
    原文地址: https://www.cnblogs.com/pythonzhichan/p/11424759.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞