Если у вас работает Jupyter / Ipython ноутбук и проблемы с ним:
ax = df1.plot()
df2.plot(ax=ax)
Выполнить команду внутри того же клетка !! По какой-то причине это не работает, когда они разделяются на последовательные ячейки. По крайней мере для меня.
Я думаю, что предыдущий зеленый ответ был плохим, почему вы можете спросить?
О, и, кстати, сериализация также плоха, вам, возможно, придется добавить Serializable повсюду (это также заставляет меня плакать ).
Итак, каково решение:
Библиотека глубокого клонирования Java Библиотека клонирования - это небольшая библиотека Java с открытым исходным кодом (apache license), которая глубокие клоны. Объектам не нужно реализовывать интерфейс Cloneable. Эффективно, эта библиотека может клонировать ЛЮБЫЕ java-объекты. Его можно использовать, то есть в реализациях кеша, если вы не хотите, чтобы кешированный объект был изменен или когда вы хотите создать глубокую копию объектов.
Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);
Проверьте это на https://github.com/kostaskougios/cloning
Все подходы к копированию объектов в Java имеют серьезные недостатки:
Clone
class
(которое вы можете прочитать через getClass()
) и скопировать поля оригинала. Для получения дополнительных сведений о проблемах с clone () см. пункт 11 книги Джошуа Блоха « Эффективная Java, второе издание »
Сериализация
Сериализация еще хуже; он имеет много недостатков clone()
, а затем некоторых. Мое решение
Мое решение добавляет новый интерфейс к моим проектам:
public interface Copyable<T> {
T copy ();
T createForCopy ();
void copyTo (T dest);
}
Мое решение добавляет новый интерфейс к моим проектам:
public interface Copyable<T> {
T copy ();
T createForCopy ();
void copyTo (T dest);
}
Код выглядит так:
class Demo implements Copyable<Demo> {
public Demo copy () {
Demo copy = createForCopy ();
copyTo (copy);
return copy;
}
public Demo createForCopy () {
return new Demo ();
}
public void copyTo (Demo dest)
super.copyTo (dest);
...copy fields of Demo here...
}
}
К сожалению, мне нужно скопировать этот код ко всем моим объектам, но это всегда один и тот же код, поэтому я могу использовать шаблон редактора Eclipse. Преимущества:
Для стандартных типов Java (например, коллекции и т. д.) ), Я использую класс утилиты, который может их скопировать. Методы имеют флаги и обратные вызовы, поэтому я могу контролировать, насколько глубока копия.
Неглубокое клонирование коллекции легко, но если вы хотите использовать глубокий клон, библиотека, вероятно, сделает вас лучше, чем ручное кодирование (так как вы хотите клонировать элементы внутри в коллекции) .
Так же, как этот ответ , я использовал библиотеку Cloner и, в частности, протестировал его против XStream (который может «клонировать» путем сериализации десериализация) и двоичной сериализации. Хотя XStream очень быстро выполняет сериализацию в / из xml, Cloner намного быстрее при клонировании:
0.0851 ms: xstream (клонирование путем сериализации / десериализации) 0.0223 ms: двоичная сериализация (клонирование путем сериализации / десериализации) 0.0017 ms: cloner * среднее время клонирования простого объекта (два поля) и стандартного конструктора public. Выполняйте 10 000 раз.
В дополнение к быстрому, здесь больше причин выбирать клонирование:
Одна из возможностей заключается в использовании сериализации:
Apache Commons предоставляет SerializationUtils
Используйте сериализацию, а затем десериализацию, но имейте в виду, что этот подход работает только с классами Serializable без переходных полей. Кроме того, ваши синглтоны больше не будут одиночными.
Я создатель клонирования lib, тот, который представил Брэд. Это решение для клонирования объектов без необходимости писать дополнительный код (нет необходимости в сериализуемых объектах или методе impl clone ())
Это довольно быстро, как сказал Брэд, и недавно я загрузил версию, которая даже Быстрее. Обратите внимание, что ручное внедрение метода clone () будет быстрее, чем clone lib, но опять же вам нужно будет написать много кода.
Cloner lib работал для меня хорошо, так как я его использую в реализации кэша для сайта с очень интенсивным трафиком (~ 1 млн запросов / день). Кэш должен клонировать приблизительно 10 объектов на запрос. Он достаточно надежный и стабильный. Но, пожалуйста, имейте в виду, что клонирование не без риска. Lib может быть настроен для печати каждого экземпляра класса, который он клонирует во время dev. Таким образом, вы можете проверить, клонирует ли он то, что, по вашему мнению, нужно клонировать, - графы объектов могут быть очень глубокими и содержать ссылки на удивительно большое количество объектов. С помощью clone lib вы можете поручить ему не клонировать объекты, которые вам не нужны, т. Е. Синглтоны.
Я использовал эту библиотеку cloning и нашел ее весьма полезной. Поскольку у него было несколько ограничений (мне нужен был более тонкий контроль над процессом клонирования: какое поле, в каком контексте и насколько глубоко нужно клонировать и т. Д.), Я создал расширенную версию. Вы управляете клонированием полей, аннотируя их в классе сущностей.
Чтобы получить его вкус, вот пример класса:
public class CloneMePlease {
@Clone(Skip.class)
String id3 = UUID.randomUUID().toString();
@Clone(Null.class)
String id4 = UUID.randomUUID().toString();
@Clone(value = RandomUUID.class, groups=CustomActivationGroup1.class)
String id5 = UUID.randomUUID().toString();
@Clone.List({
@Clone(groups=CustomActivationGroup2.class, value=Skip.class),
@Clone(groups=CustomActivationGroup3.class, value=Copy.class)})
Object activationGroupOrderTest = new Object();
@Clone(LongIncrement.class)
long version = 1l;
@PostClone
private void postClone(CloneMePlease original, @CloneInject CloneInjectedService service){
//do stuff with the original source object in the context of the cloned object
//you can inject whatewer service you want, from spring/guice to perform custom logic here
}
}
Подробнее здесь: https://github.com/mnorbi/fluidity-cloning
В случае, если это необходимо, существует также расширение спящего режима.