Быстрее глубоко клонирование

def accumulate_iter(combiner, term, a, next, b):
    result = term(a)
    while a <= b:
        a = next(a)
        if a <= b:
            result = combiner(term(a), result)

    return result

print(accumulate_iter(lambda x, y: x * y, lambda x: x * x, 1, lambda x: x + 1, 5))

Вывод:

14400

Вы также можете полностью избавиться от дополнительной итерации цикла, чтобы вам не понадобился дополнительный (x < = y) тест:

def accumulate_iter(combiner, term, a, next, b):
    result = term(a)
    a = next(a)
    while a <= b:
        result = combiner(term(a), result)
        a = next(a)

    return result

Обратите внимание, что эта вторая версия более верна тому, что на самом деле происходит. Цикл «объединяет вещи», что означает, что вам нужно объединить две вещи, но вы выбираете только одну новую вещь на каждой итерации. Поэтому перед циклом естественно иметь особый случай, который касается первого слагаемого и проходит мимо него.

21
задан wonea 31 October 2016 в 15:24
поделиться

4 ответа

Если вы говорите о дереве / графе объектов:

Написание определенного IL для сериализации объект хитрый. IMO, лучше всего посмотреть на полную сериализацию, например, как DataContractSerializer будет работать - но не обязательно с этим механизмом.

Например, protobuf-net имеет Метод Serializer.DeepClone , который может помочь. По крайней мере, он должен быть быстрее, чем DataContractSerializer . В настоящее время вам нужно добавить несколько подсказок для сериализатора (даже если просто [ProtoContract (ImplicitFields = ImplicitFields. AllPublic)] ) - однако текущая (неполная) незавершенная работа предлагает поддержку POCO без атрибутов.


Если вы говорите об отдельных объектах:

Здесь вы можете сделать довольно простые вещи с помощью Выражение в .NET 3.5; построить динамическое выражение на основе отражения и вызвать .Compile () . MiscUtil уже имеет это:

DestType clone = PropertyCopy<DestType>.CopyFrom(original);

С .NET 2.0 / 3.0 (без Expression ) вы можете использовать HyperDescriptor для аналогичных целей.

построить динамическое выражение на основе отражения и вызвать .Compile () . MiscUtil уже имеет это:

DestType clone = PropertyCopy<DestType>.CopyFrom(original);

С .NET 2.0 / 3.0 (без Expression ) вы можете использовать HyperDescriptor для аналогичных целей.

построить динамическое выражение на основе отражения и вызвать .Compile () . MiscUtil уже имеет это:

DestType clone = PropertyCopy<DestType>.CopyFrom(original);

С .NET 2.0 / 3.0 (без Expression ) вы можете использовать HyperDescriptor для аналогичных целей.

14
ответ дан 29 November 2019 в 20:03
поделиться

Я не Я не знаю, соответствует ли это в точности вашим требованиям, но вы также можете создать глубокий клон с помощью BinaryFormatter . См. ответ на связанный вопрос (от Биной ​​Антоний ):

public static class GenericCopier<T>
{
    public static T DeepCopy(object objectToCopy)
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            binaryFormatter.Serialize(memoryStream, objectToCopy);
            memoryStream.Seek(0, SeekOrigin.Begin);
            return (T) binaryFormatter.Deserialize(memoryStream);
        }
    }
}
3
ответ дан 29 November 2019 в 20:03
поделиться

Попробуйте AutoMapper или BLToolkit Mapping

3
ответ дан 29 November 2019 в 20:03
поделиться

Сериализация на основе динамических методов будет самой быстрой. (Сгенерируйте динамический метод с использованием облегченного кодогенератора и используйте его для сериализации)

Вы можете использовать один метод для каждого свойства / поля или один метод для всего объекта. Судя по моему тестированию, выполнение одного запроса на свойство не сильно снижает производительность.

См. Следующий код, чтобы узнать, как я это делаю в браузере мультимедиа: http://code.google.com/p/videobrowser/source/browse/trunk/MediaBrowser/Library/Persistance/Serializer.cs

Там же есть несколько юнит-тестов.

Наinstructionlimit есть образец быстрого отражения, который делает именно то, что вы хотите.

см .:

http: // theinstructionlimit. com /? p = 76

1
ответ дан 29 November 2019 в 20:03
поделиться