Добавление значения в пустой список или выделение значения в заранее определенный массив?

#python #arrays

#python #массивы

Вопрос:

В Python для нескольких приложений мне обычно приходится сохранять значения в массиве, например:

 results = []
for i in range(num_simulations):
    ...<calculate results_new>...
    results.append(results_new)
  

Тем не менее, я видел большинство других примеров кодов, в которых сначала объявляется массив с нулевым значением:

 results = np.zeros(len(num_simulations))
for i in range(num_simulations):
    ...<calculate results_new>...
    results[i] = results_new
  

Какой из них лучше для обычной практики? Или даже если вам нужно сравнить производительность, действительно ли существует значительная разница во времени и памяти между двумя методами?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я более или менее использую коды Python только для моделирования и, следовательно, просто хочу улучшить практику по мере продвижения.

Ответ №1:

Есть несколько вещей, которые вы должны знать об использовании массивов numpy:

  1. Если вы будете играть с матрицами, они будут намного быстрее. В вашем приложении они не обеспечивают каких-либо исключительных дополнительных преимуществ только для хранения данных
  2. ОДНАКО их инициализация сопряжена как с затратами, так и с выгодой. Преимущество использования предварительно выделенного пространства заключается в том, что вам не нужно беспокоиться о проблемах с памятью и т.д. Проблема в том, что перегрузка при выделении такого большого объема памяти более значительна (см. Конец кода)

Итак, в вашем приложении, если вы просто сохраняете результаты в списке и не выполняете никаких числовых методов, тогда нормально, если вы не используете numpy. На самом деле, это более эффективно, как показано ниже

 In [29]: %%timeit
    ...: results=[]
    ...: num_simulations=10000
    ...: for i in range(num_simulations):
    ...:     results.append(i)
    ...: 
1000 loops, best of 3: 984 µs per loop

In [30]: %%timeit
    ...: num_simulations = 10000
    ...: results=np.zeros(num_simulations)
    ...: for i in range(num_simulations):
    ...:     results[i]=i
    ...: 
1000 loops, best of 3: 1.44 ms per loop

In [31]: %%timeit
    ...: results=[]
    ...: num_simulations=100000
    ...: for i in range(num_simulations):
    ...:     results.append(i)
    ...: 
100 loops, best of 3: 10.1 ms per loop

In [32]: %%timeit
    ...: num_simulations = 100000
    ...: results=np.zeros(num_simulations)
    ...: for i in range(num_simulations):
    ...:     results[i]=i
    ...: 
100 loops, best of 3: 15.4 ms per loop

In [33]: %%timeit
    ...: results=[]
    ...: num_simulations=1000000
    ...: for i in range(num_simulations):
    ...:     results.append(i)
    ...: 
10 loops, best of 3: 103 ms per loop

In [34]: %%timeit
    ...: num_simulations = 1000000
    ...: results=np.zeros(num_simulations)
    ...: for i in range(num_simulations):
    ...:     results[i]=i
    ...: 
10 loops, best of 3: 156 ms per loop
  

Просто подведем итоги,

 Normal list vs     Numpy
984         vs     1440 microsecond     for 10000 simulations
10.1        vs     15.4 millisecond     for 100000 simulations
103         vs     156 millisecond      for 1000000 simulations
  

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

Однако практически для любого числового метода, который вы захотите выполнить с матрицей, Numpy предлагает гораздо большее преимущество