【问题标题】:Is it faster to create a new python array and initialize it to 0, or to create a copy of an array?是创建一个新的python数组并将其初始化为0,还是创建一个数组的副本更快?
【发布时间】:2022-08-17 23:52:20
【问题描述】:

我对 python 在 Python 中初始化一个新数组需要多少时间感到困惑。

假设我想创建一个长度为 n 的数组并最终用值填充它。

如果我在程序的其他地方已经有一个长度为 n 的数组,那么通过执行以下操作复制数组会更快吗:newArray = oldArray 或者通过执行以下操作创建一个新数组会更有效:newArray = [0 for _ in range(len(oldArray))]

我也尝试过newArray = [0] * len(oldArray),但这似乎是最慢的选择。

作为后续,如果 newArray 中的某些值需要与旧数组相同(3 个值?100 个值?更多?)这如何改变答案?使用不同的数据结构会降低创建时间吗?追加到数组如何适应所有这些?

感谢所有帮助!

  • 请注意新数组 = 旧数组做不是拿一份
  • 为什么不只测量在您的用例中两者中的哪一个更快?
  • 你知道newArray = oldArray 是不是浅拷贝?
  • 它只是设置 newArray 的引用吗?
  • @ChristopherOjo newArray 将被分配一个对 oldArray 的引用。尝试:newArray = oldArray.copy()

标签: python arrays for-loop data-structures time-complexity


【解决方案1】:

为了快的基准测试我已经使用 lineprofiler 分析了建议的解决方案 (profileline 是在函数上包装行分析的装饰器)

import numpy as np
from scripts.profilestats import profileline

@profileline()
def main(n):
    old_array = list(range(n))
    l1 = old_array.copy()
    l2 = [0 for _ in range(n)]
    l3 = [0] * n
    n1 = np.zeros(n)

if __name__ == '__main__':
    main(100000000)

我们得到这个结果:

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           @profileline()
     5                                           def main(n):
     6         1    1414275.0 1414275.0     13.2      old_array = list(range(n))
     7         1     374860.0 374860.0      3.5      l1 = old_array.copy()
     8         1    8747201.0 8747201.0     81.8      l2 = [0 for _ in range(n)]
     9         1     160812.0 160812.0      1.5      l3 = [0] * n
    10         1         30.0     30.0      0.0      n1 = np.zeros(n)

不出所料 np.zeros 是最快的解决方案。

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2013-05-17
    • 2016-07-23
    相关资源
    最近更新 更多