Python:创buildn个列表的最快方法

所以我想知道如何最好地创build一个空白列表的列表:

[[],[],[]...] 

由于Python如何处理内存中的列表,这不起作用:

 [[]]*n 

这确实创build[[],[],...]但每个元素是相同的列表:

 d = [[]]*n d[0].append(1) #[[1],[1],...] 

像列表理解工作:

 d = [[] for x in xrange(0,n)] 

但是这使用Python VM进行循环。 有没有什么方法可以使用隐含的循环(利用C写成)?

 d = [] map(lambda n: d.append([]),xrange(0,10)) 

这实际上比较慢。 🙁

可能唯一的办法是比边缘更快

 d = [[] for x in xrange(n)] 

 from itertools import repeat d = [[] for i in repeat(None, n)] 

它不必在每次迭代中创build一个新的int对象,并且在我的机器上快了大约5%。

编辑 :使用NumPy,你可以避免使用Python循环

 d = numpy.empty((n, 0)).tolist() 

但这实际上比列表理解慢了2.5倍。

列表parsing实际上比显式循环更有效(见示例函数的dis输出 ), map方法必须在每次迭代时调用ophaque可调用对象,这会导致相当大的开销。

无论如何, [[] for _dummy in xrange(n)]是这样做的正确方法,而其他任何方式之间的微小差异(如果存在的话)之间的速度差异都不重要。 除非你花大部分时间来做这件事 – 但是在这种情况下,你应该改用algorithm。 你多久创build一次这些列表?

这里有两种方法,一种是简单的(和概念上的),另一种是更正式的,可以在阅读数据集后在各种情况下扩展。

方法1:概念

 X2=[] X1=[1,2,3] X2.append(X1) X3=[4,5,6] X2.append(X3) X2 thus has [[1,2,3],[4,5,6]] ie a list of lists. 

方法2:正式和可扩展

另一个优雅的方式来存储列表作为不同号码列表的列表 – 它从文件中读取。 (这里的文件有数据集列车)Train是一个数据集,有50行20列。 即。 Train [0]给了我一个csv文件的第一行,train [1]给了我第二行,依此类推。 我感兴趣的是将数据集与50行作为一个列表分隔开,除了列0(这里是我解释的variables),所以必须从原始列车数据集中移除,然后在列表之后扩大列表,即列表的列表。 这是这样的代码。

请注意,由于我只对解释variables感兴趣,因此我正在从内部循环的“1”中读取数据。 而我在另一个循环中重新初始化X1 = [],否则X2.append([0:(len(train [0]) – 1)])会一遍又一遍地重写X1 – 除此之外,它还有更高的内存效率。

 X2=[] for j in range(0,len(train)): X1=[] for k in range(1,len(train[0])): txt2=train[j][k] X1.append(txt2) X2.append(X1[0:(len(train[0])-1)]) 

所以我做了一些速度比较,以获得最快的方式。 列表理解确实非常快。 唯一的方法就是避免字节码在构build列表时被执行。 我的第一次尝试是以下方法,原则上看起来更快:

 l = [[]] for _ in range(n): l.extend(map(list,l)) 

(当然产生一个长度为2 ** n的列表)根据时间表,这个结构比列表理解慢了一倍,列出了短期和长期(百万)列表。

我的第二个尝试是使用starmap为我调用列表构造函数,有一个构造,似乎以最快的速度运行列表构造函数,但仍然是慢,但只有一小部分:

 from itertools import starmap l = list(starmap(list,[()]*(1<<n))) 

有趣的是,执行时间表明,这是最终的列表调用,这使得星图解决scheme变得缓慢,因为它的执行时间几乎完全等于以下速度:

 l = list([] for _ in range(1<<n)) 

当我意识到列表(())也产生一个列表时,我的第三次尝试来了,所以我尝试了简单的:

 l = list(map(list, [()]*(1<<n))) 

但是这比starmap调用慢。

结论:对于速度疯子:请使用列表理解。 只有调用函数,如果你必须。 使用builtins。

要创build列表和列表的列表使用下面的语法

  x = [[] for i in range(10)] 

这将创build一个列表,并初始化它把数字放在[[数字]和列表放置长度的范围(长度)

  • 要创build列表清单,请使用以下语法。

    对于范围(10)中的i,x = [[[0]对于范围(3)中的i]]

这将初始化列表与10 * 3维度和值为0

  • 访问/操作元素

    X [1] [5] =值