Чистый вектор каждое повторение цикла. Какова большая часть памяти эффективный путь?

Этот вопрос похож на Изменение цвета участков скрипки у Матплотлиба , но не совсем так же. Я не буду повторять то, что Ник Т написал в его ответ (обязательно поблагодарите его также), но просто добавлю, что PolyCollection также set_alpha и set_zorder методы, которые вы можете использовать следующим образом:

plt.figure()
plt.axvspan(-5, 0, color='r', alpha=0.5, zorder=1)
plt.axvspan(0, 5, color='g', alpha=0.5, zorder=1)
parts = plt.violinplot(np.random.normal(0, 1, 100), vert=False)
parts['bodies'][0].set_alpha(0.8)
parts['bodies'][0].set_zorder(2)

Дает:

enter image description here [119 ]

5
задан sharptooth 6 March 2009 в 14:12
поделиться

9 ответов

С первым вариантом Вы перераспределяете буфер вектора на каждом повторении – это является обычно довольно дорогостоящим. Со вторым вариантом Вы только иногда перераспределяете. Второй вариант лучше, так как скорость является приоритетом для Вас.

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

11
ответ дан 18 December 2019 в 05:44
поделиться

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

Попытайтесь действовать как инженер не гадалка. Создайте тест и измерьте различие.

6
ответ дан 18 December 2019 в 05:44
поделиться

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

5
ответ дан 18 December 2019 в 05:44
поделиться

Поскольку различия в коде тривиальны, почему бы не протестировать оба подхода и видеть который работы лучше всего для Вашего конкретного приложения?

5
ответ дан 18 December 2019 в 05:44
поделиться

Это зависит немного от того, как Тип должен быть создан/разрушен, сказал бы я. Если это - POD, который не требует разрушения, можно пропустить ясное (), который называет все деструкторы в цикле, и используйте его в качестве статического массива вместо этого:

std::vector<Type> my_vector(size);
for (...)
{
  int index = 0;
  // Do stuff
  my_vector[index] = some_value;
}

(Протест: кодируйте непротестированный),

1
ответ дан 18 December 2019 в 05:44
поделиться

... резервирование достаточной памяти для векторов заранее поможет мне много с сокращением использования памяти

допустить ошибку... что?! Это не имеет никакого смысла вообще. Резервирование памяти не помогает с сокращением использования памяти всегда. Это предотвращает потребность в постоянном перераспределении, которое делает вещи быстрее, но насколько использование идет, Вы не извлекаете пользы.

1
ответ дан 18 December 2019 в 05:44
поделиться

Второй будет использовать максимальную память всего использования его через цикл, т.е. максимальный размер типов stuff_count. std::vector::clear() не обязательно освобождает память. Т.е. если Вы звоните std::vector::capacity() прежде и после std::vector::clear() стандартная реализация приспосабливания могла возвратить то же значение.

В лучшем случае Вы уменьшите количество раз, Вы выделяете память с вышеупомянутой схемой. Но Вы, конечно, не будете уменьшать объем потребляемой памяти ни в какой точке. Если Вы хотите уменьшиться к зарезервированному объему памяти, необходимо использовать векторную идиому подкачки:

std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count); 

Или Ваше первое решение, так как полный эффект будет тем же.

1
ответ дан 18 December 2019 в 05:44
поделиться

Если необходимо сделать, много из добавляет станд. использования:: двухсторонняя очередь вместо станд.:: вектор и просто использует "push_back".

0
ответ дан 18 December 2019 в 05:44
поделиться

как насчет?

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
0
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: