Вот потенциальная оптимизация для больших кадров данных. Это выполняется быстрее, когда в поле «взрыва» есть несколько равных значений. (Чем больше размер кадра данных сравнивается с уникальным значением в поле, тем лучше будет работать этот код.)
def lateral_explode(dataframe, fieldname):
temp_fieldname = fieldname + '_made_tuple_'
dataframe[temp_fieldname] = dataframe[fieldname].apply(tuple)
list_of_dataframes = []
for values in dataframe[temp_fieldname].unique().tolist():
list_of_dataframes.append(pd.DataFrame({
temp_fieldname: [values] * len(values),
fieldname: list(values),
}))
dataframe = dataframe[list(set(dataframe.columns) - set([fieldname]))]\
.merge(pd.concat(list_of_dataframes), how='left', on=temp_fieldname)
del dataframe[temp_fieldname]
return dataframe
Запустите путем предотвращения указателей.
Используют их когда:
Bar
экземпляром на самом деле управляет некоторая другая часть Вашей программы, тогда как Foo
класс просто должен быть в состоянии получить доступ к нему. Bar
объект (т.е. Вы хотите создать его после построение Foo
). Bar
объект не может существовать вообще; Вы использовали бы null
также в Java. Однако выезд повышение:: дополнительный также. Bar
на самом деле базовый класс, и Вам нужен экземпляр, чтобы быть полиморфными. В любом из этих случаев (*), запустите при помощи интеллектуального указателя, такой как [1 112] повышение:: shared_ptr. Иначе Вы, вероятно, забудете освобождать память рано или поздно. Как только Вы знаете то, что Вы делаете, считаете индивидуальными, какой тип указателя является лучшим.
(*) любой случай †“кроме, вероятно, маркер относительно виджетов GUI; в этом случае Ваш инструментарий по всей вероятности управлял бы ресурсами для Вас также
class Foo {
Bar b;
}
b , содержал в Foo. Если объект Foo заканчивает время жизни, b автоматически заканчивает время жизни также. Это что состав моделей. b выше обозначает сам объект, не только указатель на него как в Java. Для этого, если b выйдет из объема, объект закончит время жизни.
class Foo {
Bar * b;
}
Здесь, объект b указывает на, используются или ссылаемый объект Foo. Если объект Foo заканчивает время жизни, объект b указывает на, может продолжить жить, в зависимости от обстоятельств. Это может привыкнуть к образцовому агрегированию и общим отношениям. Объект может быть совместно использован с другими объектами Foo, например.
Указатели примерно, какие ссылки находятся в Java. Они ни на что не могут также указать. Если указатель ни на что не указывает, это - нулевой указатель.
Подобный указателям ссылки. Ссылки в C++ должны быть инициализированы и могут только указать на один (допустимый) объект, для которого была инициализирована ссылка. Ссылка для этого не может содержать значение, которое не могло означать "ничего" как null
в Java.
Необходимо сделать некоторое программирование блока и понять расположение памяти хорошо. C является просто межплатформенным блоком, в отличие от Java или других языков. Для использования его правильно нужно понять низкоуровневые детали.
Все сделанные комментарии действительны, но для людей как Вы, кто спрыгивает с высокоуровневых языков к C, имение этого вида опыта было бы более, чем выгодно. С надлежащим пониманием Вы не задавали бы вопросы как этот больше.
В первой памяти в качестве примера для Панели объект будет выделен автоматически при построении объекта Foo. Во втором случае необходимо выделить память сами. Таким образом, необходимо звонить:
Foo *foo = new Foo();
foo->b = new Bar();
Это может быть желательно, если объект Панели является большим, и Вы не хотите связывать его объектом Foo. Также желательно, когда конструкция объекта Панели независима от создания объекта Foo. В этом случае объект b "введен" в нечто:
Foo *foo = new Foo();
foo->b = b_ptr;
, где b_ptr создается где-то в другом месте и указатель передается нечто.
Для меньших объектов это опасно, поскольку можно забыть выделять память.
Оба хорошо происходят в различных условиях. Например, если Вы знаете, как создать b, когда объект класса, Foo создается, первое, в порядке. Но если Вы не делаете, единственный выбор состоит в том, чтобы использовать второе.