Глубокая копия Python и копирование вручную дают разный результат

#python #python-3.x

#python #python-3.x

Вопрос:

Я использую deepcopy в своей программе. Это прекрасно работает для достижения результата. Однако использование deepcopy действительно снижает производительность моей программы. Итак, я пытаюсь выполнить копирование вручную, создав сам объект. Когда я сравниваю производительность, это дает лучшую производительность, но результат программы отличается.

Это мой код для deepcopy.

 temp_location = deepcopy(self.locations)
 

И это мой код после замены deepcopy созданием ручной копии объекта.

 temp_location = self.new_deepcopy(self.locations)

def new_deepcopy(self, locations):
    result = []
    for location in locations:
        result.append(Location(
           location.location_id,
           location.open_time,
           location.close_time,
           location.price,
           location.score,
           location.duration)
        )
    return result
 

self.locations является списком Location и Location является объектом, который я определяю следующим образом.

 class Location:
    def __init__(self, location_id, open_time, close_time, price, score, duration):
        self.location_id = location_id
        self.open_time = open_time
        self.close_time = close_time
        self.price = price
        self.score = score
        self.duration = duration
        self.waiting_time = 0
        self.visit_time = 0
        self.leave_time = 0
 

Как сделать точную копию с другой ссылкой без использования deepcopy? Почему new_copy то, что я создаю, дает другой результат?

Комментарии:

1. Можете ли вы объяснить, чем отличается результат?

2. В чем разница в поведении, которую вы видите?

3.Чем отличаются результаты? Если вам нужно поведение deepcopy , почему бы просто не использовать deepcopy ?

4. @ScottHunter потому что я хочу повысить производительность своей программы.

5. «иногда это не равнозначно»: Каким образом (ами)?

Ответ №1:

Я думаю, что ваш ‘new_deepcopy’, по-видимому, недостаточно глубоко копирует ваши переменные. Насколько я понимаю python (пожалуйста, поправьте меня, если я ошибаюсь), каждая переменная в Python является указателем на ячейку памяти. Так что, вероятно, ваш new_deepcopy просто передает эти указатели на объект, а не фактические значения. И именно поэтому ваш код кажется быстрее, но возвращает неправильные результаты. Если вы хотите повысить производительность своего кода, вы можете рассмотреть возможность использования cython

Комментарии:

1. Согласно этому объяснению, если я это сделаю a=1;b=a;a=2 , тогда b должно быть 2 . Это неправда. Разница заключается в том, как обрабатываются изменяемые и неизменяемые объекты.

2. Как я уже упоминал выше, я не совсем уверен в том, как python справляется с этими вещами. Но, насколько я понимаю, предоставленный код создает новый объект, который содержит ссылки на старые значения. Проверьте официальные документы [ docs.python.org/3.7/library/copy.html ]

3. Факты и мифы об именах и значениях Python

4. @Matthias вы правы в своем примере. Но попробуйте следующее: a=[1,2,3,4], b=a, a.append(5), b >> [1,2,3,4,5]

5. Это упомянутое различие между изменяемыми и неизменяемыми объектами. В этом вопросе мы не знаем тип атрибутов объектов, поэтому мы просто предполагаем, что произойдет.