#python #performance #dictionary #initialization
#python #Производительность #словарь #инициализация
Вопрос:
Рассмотрим, что у меня есть следующий код:
class MyDict(dict):
def __init__(self, original_dict):
dict.__init__(self, original_dict) # THIS LINE IS THE PROBLEM
self.bar = 'baz'
def foo(self): return self.bar
Это может показаться довольно невинным, но в моем приложении копирование dict, которое происходит при вызове суперкласса __init__
, является серьезной проблемой производительности, поскольку это занимает время O ( len(original_dict)
), и я делаю это много раз для относительно длинных диктовок. Я считаю, что это должно быть возможно сделать за O (1) раз, если бы я мог каким-то образом заменить self
на original_dict
instead, а затем выполнить остальную часть инициализации.
Обычно я думаю, что это можно было бы обойти, не подклассируя dict и используя вместо этого обычные функции. Но это невозможно, поскольку MyDict
это библиотечный класс, который я действительно хочу использовать и, возможно, подкласс для решения этой проблемы. Я думал о возможном переопределении __new__
, но я не уверен, как именно это сделать для достижения желаемого эффекта, и я не уверен, оправдано ли это в данном случае, поскольку это обычно считается плохой практикой по уважительной причине.
Комментарии:
1. Что должно произойти, если будет внесено изменение
original_dict
?2. Я не уверен, о какой именно проблеме вы говорите. Создание обычного словаря в Python с
dict(other_dict)
помощью создаст копиюother_dict
. Создание экземпляраMyDict
withMyDict(other_dict)
также копируетother_dict
один раз, поэтому, кроме некоторых накладных расходов на вызов функции, разницы в производительности, похоже, нет.3. Как насчет того, чтобы просто указать на то же значение вместо копирования? Также какова цель подкласса dict?
4. Итак, ваша проблема в том, что используемая вами библиотека копирует словарь, который вы не хотите копировать. Я думаю, тогда ваши варианты — либо не использовать эту библиотеку, либо изменить ее, чтобы не копировать dict? Я все еще смущен этим вопросом, и проблема, похоже, не имеет никакого отношения к подклассу
dict
.5. Что вы, возможно, можете сделать, это создать свой другой словарь как a
MyDict
в первую очередь, а не создавать его какdict
первый.