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] =值