"增长"(附加)序列对象

hat*_*rix 5 python matlab

在Matlab中,建议不要使用这种类型的算法("增长数组")

mine = []
for i=1:100,
    mine = [mine,randn(1)]
end
Run Code Online (Sandbox Code Playgroud)

而似乎许多Python的例子都显示了这种算法(虽然这是一个非常糟糕的例子):

import numpy.random as rand

mine = []
for i in range(100):
    mine.append(rand.random(1)[0])
Run Code Online (Sandbox Code Playgroud)

我想知道为什么 - 有什么区别?

NPE*_*NPE 7

不同之处在于:

  • 在MATLAB中,循环的每次迭代都会重新分配矩阵,将大小增加一,并将整个内容复制到新分配的空间中.
  • Python列表不能那样工作.分配的空间比任何给定点所需的空间多,并且这个分配的空间以保证附加在分摊的常量时间内完成的方式增长.

也就是说,我认为区别主要在于文化:

  • 在MATLAB中使用大型数字矩阵是很常见的,并且一次增加这样的矩阵一个元素(或一行/列)确实很昂贵.
  • 另一方面,没有人会使用Python列表(或列表列表)来表示一个大矩阵:这将非常慢并且会很难使用内存.数值Python中ndarray将被代替,并且ndarray将提供完全相同的权衡作为MATLAB矩阵.