2016-05-01 2 views
1

Мне нужно сделать очень большое количество симуляций на сетке R*C.Каков самый быстрый способ скопировать 2D-массив в Python?

Эти симуляции изменяют сетку, поэтому мне нужно скопировать мою опорную сетку перед каждым, а затем применить мою имитирующую функцию к новой новой сетке.

Что является самым быстрым способом сделать это в Python?


Поскольку я не нашел подобный вопрос на StackOverflow, я сделал ИСПЫТАНИЙ себя и решил опубликовать их здесь думать, что они могут быть полезны другим людям.

Ответ будет ответом сообщества, чтобы другие люди могли добавлять новые измерения с помощью, возможно, других методов.

Если вы добавите другой метод, не забудьте измерить все старые тесты и обновить их, поскольку время зависит от используемого компьютера, не допускайте смещения результатов.

+0

Какой тип? NumPy ndarray? массив python? вложенный список python? какой-то другой массив? – MSeifert

ответ

2

Я использовал переменный Баш для настройки 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+ (по умолчанию, 11 октября 2015, 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 является чрезвычайно быстрее, особенно, если один избегает создания новой таблицы каждый раз.

Смежные вопросы