【问题标题】:What is the fastest way to copy a 2D array in Python?在 Python 中复制二维数组的最快方法是什么?
【发布时间】:2016-05-01 15:07:49
【问题描述】:

我必须在R*C 网格上进行大量模拟。

这些模拟正在改变网格,所以我需要在每个之前复制我的参考网格,然后将我的模拟功能应用到新的网格上。

在 Python 中最快的方法是什么?


由于我在 StackOverflow 上没有找到类似的问题,所以我自己进行了测试,并决定将它们发布在这里,认为它们可能对其他人有用。

答案将是社区响应,以便其他人可以使用其他可能的技术添加新的测量值。

如果您添加其他方法,请记住测量所有旧测试并更新它们,因为时间取决于使用的计算机,避免结果出现偏差。

【问题讨论】:

  • 什么样的数组? NumPy 数组?蟒蛇数组?嵌套的python列表?其他数组?

标签: python arrays performance copy


【解决方案1】:

我使用 bash 变量来设置 timeit 测试:

setup="""
R = 100
C = 100
from copy import deepcopy
import numpy as np
ref = [[i for i in range(C)] for _ in range(R)]
ref_np = np.array(ref)
cp = [[100 for i in range(C)] for _ in range(R)]
cp_np = np.array(cp)
"""

为了方便,我还设置了一个临时别名pybench

alias pybench='python3.5 -m timeit -s "$setup" $1'

Python 3

Python 3.5.0+(默认,2015 年 10 月 11 日,09:05:38)

  • 深拷贝:

    >>> pybench "cp = deepcopy(ref)"
    100 loops, best of 3: 8.29 msec per loop
    
  • 使用索引修改预先创建的数组:

    >>> pybench \
    "for y in range(R):
        for x in range(C):
            cp[y][x] = ref[y][x]"
    1000 loops, best of 3: 1.16 msec per loop
    
  • 嵌套列表理解:

    >>> pybench "cp = [[x for x in row] for row in ref]"
    1000 loops, best of 3: 390 usec per loop
    
  • 切片:

    >>> pybench "cp = [row[:] for row in ref]"
    10000 loops, best of 3: 45.8 usec per loop
    
  • NumPy 副本:

    >>> pybench "cp_np = np.copy(ref_np)"
    100000 loops, best of 3: 6.03 usec per loop
    
  • 复制到预先创建的 NumPy 数组:

    >>> pybench "np.copyto(cp_np, ref_np)"
    100000 loops, best of 3: 4.52 usec per loop
    

正如您可能已经猜到的那样,这些结果并没有什么令人惊讶的地方,使用 NumPy 的速度要快得多,尤其是在避免每次都创建新表的情况下。

【讨论】:

    【解决方案2】:

    为了补充 Delgan 的答案,numpy copy 的文档说使用 numpy.ndarray.copy 作为首选方法。所以现在,不做时序测试,我将使用 numpy.ndarray.copy

    https://numpy.org/doc/stable/reference/generated/numpy.copy.html

    https://numpy.org/doc/stable/reference/generated/numpy.ndarray.copy.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 2012-12-10
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多