簡體   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