在Python中,复制2D数组的最快方法是什么?

4

我需要在一个R*C的网格上进行大量的模拟。

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

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


由于我在StackOverflow上没有找到类似的问题,因此我自己进行了测试,并决定将它们发布在这里,希望它们对其他人有用。

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

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


什么样的数组?NumPy ndarray?Python 数组?嵌套 Python 列表?其他类型的数组? - MSeifert
2个回答

14

我使用了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会极大地提高速度,尤其是如果避免每次创建新表格。


    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接