#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. Это упомянутое различие между изменяемыми и неизменяемыми объектами. В этом вопросе мы не знаем тип атрибутов объектов, поэтому мы просто предполагаем, что произойдет.