如何预先分配列表?

2024-05-19 00:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

zeroArray = [0]*Np
zeroMatrix = []
for i in range(Np):
    zeroMatrix.append(zeroArray[:])

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


Tags: 方法代码in列表fornprangeappend
3条回答

你可以这样做:

zeroMatrix = [[0] * Np for i in range(Np)]

更新:好吧,如果我们要进入一场比赛,我发现(在我的电脑上)比无所不在的“方法”更快的东西。这当然比不上numpy,但这都是学术性的,对吧?我是说我们在讨论微秒。

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

zeroArray = [0] * Np
zeroMatrix = [zeroArray[:] for i in range(Np)]

我的测试结果:

$ 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

这可能会稍微更有效率:

zeroArray = [0]*Np
zeroMatrix = [None] * Np
for i in range(Np):
    zeroMatrix[i] = zeroArray[:]

你真正想要的不会像你希望的那样奏效。这是因为,如果使用*创建列表元素的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

我不能自己使用基于numpy的解决方案,因为我的系统上没有Python3的numpy包。但它的速度绝对要快得多。

也许你应该考虑使用NumPy。你好像在做数字工作,这就是它的目的。这是迄今为止最快的,不包括import语句:

import numpy
Np = 80
zeroMatrix = numpy.zeros((Np, Np))

次数:

>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

相关问题 更多 >

    热门问题