我正在使用以下代码创建一个列表的列表:
zeroArray = [0]*Np
zeroMatrix = []
for i in range(Np):
zeroMatrix.append(zeroArray[:])
有没有更高效的方法?我希望类似于zeroArray = [0]*Np; zeroMat = zeroArray*Np这样的东西,但是找不到类似的东西。
我正在使用以下代码创建一个列表的列表:
zeroArray = [0]*Np
zeroMatrix = []
for i in range(Np):
zeroMatrix.append(zeroArray[:])
有没有更高效的方法?我希望类似于zeroArray = [0]*Np; zeroMat = zeroArray*Np这样的东西,但是找不到类似的东西。
也许你应该考虑使用NumPy,它专门用于数字计算。这是目前最快的方法,不包括导入语句:
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
你可以这样做:
zeroMatrix = [[0] * Np for i in range(Np)]
更新: 好吧,如果我们要将其变成一场比赛,我在我的电脑上找到了比Omnifarious'方法更快的东西。当然,这并不能打败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
zeroMatrix
的每个元素成为同一个可变列表的副本,因此zeroMatrix[0][2] += 1
将影响所有的zeroMatrix[n][2]
元素。(除非他们已经改变了Python 3的这种行为。我真的需要升级了...)编辑:算了,你已经把它删掉了。 - Chris LutzzeroArray = [0]*Np
zeroMatrix = [None] * Np
for i in range(Np):
zeroMatrix[i] = zeroArray[:]
$ 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
由于我系统上没有Python3的numpy包,因此无法对基于numpy的解决方案进行时间测试。但是它明显比其他方案快得多。
zeroMatrix = [[0 for _ in range(Np)] for _ in range(Np)]
我不确定这是否会提高性能(像往常一样进行分析),但我不知道你所说的“有效”是什么意思。除了避免使用list.append
之外。