2016-05-01 45 views
1

我必須在R*C網格上進行大量的模擬。在Python中複製二維數組的最快方法是什麼?

這些模擬正在改變網格,所以我需要在每個網格之前複製我的參考網格,然後在新的新網格上應用我的模擬功能。

在Python中這樣做的最快方法是什麼?


因爲我還沒有發現過類似的問題在計算器上,我做了測試自己,並決定在這裏發表他們認爲他們可能會向其他人有用。

答案將是社區響應,以便其他人可以使用其他技術添加新測量。

如果您添加其他方法,請記住測量所有舊測試並更新它們,因爲時間取決於使用的計算機,請避免偏差結果。

+0

什麼樣的數組? NumPy ndarray? python數組?嵌套的python列表?一些其他陣列? – MSeifert

回答

2

我用一個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+(默認,二○一五年十月一十一日,9點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的是巨大的更快,特別是如果以避免創建新表每次。

相關問題