如何预先分配列表列表?

Cha*_* L. 10 python

我正在使用此代码创建列表列表:

zeroArray = [0]*Np
zeroMatrix = []
for i in range(Np):
    zeroMatrix.append(zeroArray[:])
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法来做到这一点?我希望有一些零线路的东西= [0]*Np; zeroMat = zeroArray*Np但找不到类似的东西.

det*_*tly 11

也许你应该考虑使用NumPy.看起来你正在做数字工作,这就是它的用途.这是目前为止最快的,不包括import语句:

import numpy
Np = 80
zeroMatrix = numpy.zeros((Np, Np))
Run Code Online (Sandbox Code Playgroud)

时报:

>python -m timeit -s "import numpy; Np = 80" "zeroMatrix = numpy.zeros((Np, Np))"
100000 loops, best of 3: 4.36 usec per loop

>python -m timeit -s "Np = 80" "zeroArray = [0]*Np" "zeroMatrix = [None] * Np" "for i in range(Np):" "  zeroMatrix[i] = zeroArray[:]"
10000 loops, best of 3: 62.5 usec per loop

>python -m timeit -s "Np = 80" "zeroMatrix = [[0] * Np for i in range (Np)]"
10000 loops, best of 3: 77.5 usec per loop

>python -m timeit -s "Np = 80" "zeroMatrix = [[0 for _ in range(Np)] for _ in range(Np)]"
1000 loops, best of 3: 474 usec per loop
Run Code Online (Sandbox Code Playgroud)

  • +1,当然numpy有一组强大的数组操作,一旦你设置了数组,它比以后为python列表旋转你自己的速度快得多. (3认同)

sen*_*rle 8

你可以这样做:

zeroMatrix = [[0] * Np for i in range(Np)]
Run Code Online (Sandbox Code Playgroud)

更新:如果我们要进入一场比赛,我发现的东西(在我的电脑上)比Omnifarious'方法更快.这当然不会打败numpy; 但这对所有学术都是正确的吗?我的意思是我们在这里谈论微秒.

我认为这是有效的,因为它避免append 避免预分配zeroMatrix.

zeroArray = [0] * Np
zeroMatrix = [zeroArray[:] for i in range(Np)]
Run Code Online (Sandbox Code Playgroud)

我的测试结果:

$ python -m timeit -s "Np = 80" "zeroMatrix = [[0] * Np for i in range(Np)]"
1000 loops, best of 3: 200 usec per loop
$ python -m timeit -s "Np = 80" "zeroArray = [0] * Np" "zeroMatrix = [None] * Np" "for i in range(Np):" "    zeroMatrix[i] = zeroArray[:]"
10000 loops, best of 3: 171 usec per loop
$ python -m timeit -s "Np = 80" "zeroArray = [0] * Np" "zeroMatrix = [zeroArray[:] for i in range(Np)]"
10000 loops, best of 3: 165 usec per loop
Run Code Online (Sandbox Code Playgroud)


Omn*_*ous 5

这可能会稍微有点效率:

zeroArray = [0]*Np
zeroMatrix = [None] * Np
for i in range(Np):
    zeroMatrix[i] = zeroArray[:]
Run Code Online (Sandbox Code Playgroud)

你真正想要的东西不会以你希望的方式运作.这是因为如果使用创建Np列表元素的副本*,则会获得Np对同一事物的引用.对于0这个并不是什么大不了的事,因为当你添加任何东西时,你只需要一个新的数字.但对于列表,您最终会得到一个矩阵,只要您更改了行的任何元素,整个列就会随之改变.

这种方式是迄今为止提到的第二快:

$ python3 -m timeit -s 'Np = 80' 'zeroArray = [0]*Np
zeroMatrix = [None] * Np
for i in range(Np):
    zeroMatrix[i] = zeroArray[:]'
10000 loops, best of 3: 72.8 usec per loop

$ python3 -m timeit -s 'Np = 80' 'zeroMatrix = [[0] * Np for i in range(Np)]'
10000 loops, best of 3: 85 usec per loop

$ python3 -m timeit -s 'Np = 80' 'zeroMatrix = [[0 for _ in range(Np)] for _ in range(Np)]'
1000 loops, best of 3: 566 usec per loop
Run Code Online (Sandbox Code Playgroud)

我不能自己做基于numpy的解决方案的时间,因为我的系统上没有Python3的numpy包.但它的速度肯定更快.