Могу ли я подкласс dict в python и избежать копирования его данных?

#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 with MyDict(other_dict) также копирует other_dict один раз, поэтому, кроме некоторых накладных расходов на вызов функции, разницы в производительности, похоже, нет.

3. Как насчет того, чтобы просто указать на то же значение вместо копирования? Также какова цель подкласса dict?

4. Итак, ваша проблема в том, что используемая вами библиотека копирует словарь, который вы не хотите копировать. Я думаю, тогда ваши варианты — либо не использовать эту библиотеку, либо изменить ее, чтобы не копировать dict? Я все еще смущен этим вопросом, и проблема, похоже, не имеет никакого отношения к подклассу dict .

5. Что вы, возможно, можете сделать, это создать свой другой словарь как a MyDict в первую очередь, а не создавать его как dict первый.