Этот вопрос похож на Изменение цвета участков скрипки у Матплотлиба , но не совсем так же. Я не буду повторять то, что Ник Т написал в его ответ (обязательно поблагодарите его также), но просто добавлю, что 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)
Дает:
С первым вариантом Вы перераспределяете буфер вектора на каждом повторении – это является обычно довольно дорогостоящим. Со вторым вариантом Вы только иногда перераспределяете. Второй вариант лучше, так как скорость является приоритетом для Вас.
Неясно от Вас вопрос, где число элементов, знают от. Возможно, даже можно быстро вычислить максимальное число элементов для всех повторений, установить это, чтобы быть размером буфера и не иметь никакого перераспределения.
Я предвижу, что предсказание векторных размеров и резервирование достаточной памяти для векторов заранее помогут мне много с сокращением использования памяти.
Попытайтесь действовать как инженер не гадалка. Создайте тест и измерьте различие.
Второй мог быть немного быстрее, но я нахожу первый инструмент для очистки.
Поскольку различия в коде тривиальны, почему бы не протестировать оба подхода и видеть который работы лучше всего для Вашего конкретного приложения?
Это зависит немного от того, как Тип должен быть создан/разрушен, сказал бы я. Если это - POD, который не требует разрушения, можно пропустить ясное (), который называет все деструкторы в цикле, и используйте его в качестве статического массива вместо этого:
std::vector<Type> my_vector(size);
for (...)
{
int index = 0;
// Do stuff
my_vector[index] = some_value;
}
(Протест: кодируйте непротестированный),
... резервирование достаточной памяти для векторов заранее поможет мне много с сокращением использования памяти
допустить ошибку... что?! Это не имеет никакого смысла вообще. Резервирование памяти не помогает с сокращением использования памяти всегда. Это предотвращает потребность в постоянном перераспределении, которое делает вещи быстрее, но насколько использование идет, Вы не извлекаете пользы.
Второй будет использовать максимальную память всего использования его через цикл, т.е. максимальный размер типов stuff_count. std::vector::clear()
не обязательно освобождает память. Т.е. если Вы звоните std::vector::capacity()
прежде и после std::vector::clear()
стандартная реализация приспосабливания могла возвратить то же значение.
В лучшем случае Вы уменьшите количество раз, Вы выделяете память с вышеупомянутой схемой. Но Вы, конечно, не будете уменьшать объем потребляемой памяти ни в какой точке. Если Вы хотите уменьшиться к зарезервированному объему памяти, необходимо использовать векторную идиому подкачки:
std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count);
Или Ваше первое решение, так как полный эффект будет тем же.
Если необходимо сделать, много из добавляет станд. использования:: двухсторонняя очередь вместо станд.:: вектор и просто использует "push_back".
как насчет?
std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));