繁体   English   中英

在 Python 中复制二维数组的最快方法是什么?

[英]What is the fastest way to copy a 2D array in Python?

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

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

在 Python 中执行此操作的最快方法是什么?


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

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

如果添加另一种方法,请记住测量所有旧测试并更新它们,因为时间取决于所使用的计算机,避免对结果产生偏差。

我使用了一个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)

  • deepcopy的:

     >>> 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的速度非常快,尤其是如果避免每次都创建一个新表的话。

添加到 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM