Онлайн:
# Assuming your `df` doesn't have target in the first place
df['target'] = 0
df.loc[df[df.flag==1].drop_duplicates('date').index, 'target'] = 1
Это кажется мне как Вы, должен усилить функции, которые надлежащая платформа внедрения зависимости может дать Вам. Не используйте другую логику конструкции для тестирования/производства.
С пружиной одноэлементные инжекции только выполняются при контейнерном запуске. Опытные инжекции сделаны каждый раз. Полное проводное соединение также сделано каждый раз, когда Вы выполняете модульный тест, если оно соединяется проводом. Так профильные модульные тесты обычно не хорошая идея.
Возможно, Вы используете слишком мало одноэлементных объемов и слишком большого опытного объема? (Прототип = новый экземпляр каждый раз)
Хорошая вещь о пружинной инжекции состоит в том, что можно использовать прокси объема, подразумевая, что граф объектов может быть похожим на это:
A Singleton
|
B Singleton
|
C Prototype (per-invocation)
|
D Singleton
|
E Session scope (web app)
|
F Singleton
И каждый запрос только создал бы 1 экземпляр C и один экземпляр E на сессию. A, B, D и F являются одиночными элементами. Если это не веб-приложение, у Вас нет объема сессии по умолчанию, но можно также сделать пользовательские объемы (объем "Окна" звучит прохладным для оконного настольного приложения). Подсказка здесь - то, что можно "представить" объемы на любом уровне, эффективно у Вас может быть десять слоев одноэлементных объектов и внезапно чего-то, что ограниченная по объему сессия разоблачает. (Это может действительно коренным образом изменить, как Вы реализуете некоторые сквозные опции в многоуровневой архитектуре, но это - другая история),
Это действительно дает минимальное создание объекта, возможное в рамках модели DI, я думаю.
Хотя это, Кидаются за Java, я полагаю, что много других платформ DI должны поддерживать подобные функции. Возможно, не большинство минималистических.
Я думаю, что у Вас должен только быть "конструктор DI". Вы вызываете этого конструктора для тестирования, а также в производстве.
class ShortLivedThing {
IDependency1 dep1;
IDependency1 dep2;
IDependency1 dep3;
...
int TheRealData;
public ShortLivedThing(IDependency1 d1, IDependency2 d2, IDependency3 d3) {
dep1 = d1; dep2 = d2; dep3 = d3;
}
}
Таким образом, у Вас нет проблемы инстанцирования дерева объектов каждый раз, когда вызов метода сделан за пределами Ваших тестов. Конечно, для производства необходимо обеспечить электричеством объекты правильно вне самих участвующих объектов, который является хорошей вещью.
Таким образом: не идите для 50% DI / 50%-е жесткое кодирование, идите для 100% DI.
Если Ваше беспокойство является медленными тестами, попытайтесь выполнить их параллельно и не позволяйте процессу тестирования прервать Ваших программистов.
Автоматизируйте этот процесс:
Лучше, если первая регистрация не сделана в фактический репозиторий. Доберитесь до временного и сделайте сборку из этого. Дополнительно можно выполнить тесты производительности, проверки стиля и т.д. и включать их в e - почта. Если Вы делаете это, добавьте один шаг к автоматизированному процессу:
Таким образом, медленные тесты не являются никаким беспокойством. Также, когда разработчик должен знать, повредил ли ее код что-то или заставил производительность повысить, она ожидала, она просто регистрируется и ожидает e - почта, сгенерированная для нее.
Лучшее, которое я могу придумать, должно поместить все зависимости в один объект "контекста", который является затем общим для все экземпляры. Это должно смягчить проблему производительности несколько.
Если Вы нацелены на.NET, проверяете Autofac. Это имеет различные объемы (одиночный элемент, фабрика, контейнер) для тонкой настройки аспектов создания, детерминированное распоряжение для держания использования ресурсов в страхе и позволяет использовать GeneratedFactories и лямбда-выражения, чтобы настроить компоненты и избежать стоимости отражения.