#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:
- Если вы будете играть с матрицами, они будут намного быстрее. В вашем приложении они не обеспечивают каких-либо исключительных дополнительных преимуществ только для хранения данных
- ОДНАКО их инициализация сопряжена как с затратами, так и с выгодой. Преимущество использования предварительно выделенного пространства заключается в том, что вам не нужно беспокоиться о проблемах с памятью и т.д. Проблема в том, что перегрузка при выделении такого большого объема памяти более значительна (см. Конец кода)
Итак, в вашем приложении, если вы просто сохраняете результаты в списке и не выполняете никаких числовых методов, тогда нормально, если вы не используете 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 предлагает гораздо большее преимущество