Узкое место в производительности с структурой данных отображения Python - PullRequest
0 голосов
/ 02 октября 2011

У меня небольшая проблема с производительностью, когда одна из моих структур данных используется для большого проекта в python.

По сути, я импортирую табличный файл с разделителями. Используя обычный итератор файла python open (...), я разделяю строки с помощью line.split ("\ t"). Теперь я хочу, чтобы фактическое значение столбца было вставлено в какой-то словарь, возвращающий идентификатор для значения. И там становится медленно:

В общем - класс словаря выглядит так:

class Dictionary(list):
  def getBitLength(self):
      if(len(self) == 0):
          return 0
      else:
          return math.log(len(self), 2)

  def insertValue(self, value):
      self.append(value)
      return len(self) - 1

  def getValueForValueId(self, valueId):
      return self[valueId]

  def getValueIdForValue(self, value):
      if(value in self):
         return self.index(value)
      else:
         return self.insertValue(value)

Основная идея заключалась в том, что valueId является индексом значения в списке словаря.

Профилирование программы говорит мне, что более 50% тратится на getValueIdForValue (...).

1566562 function calls in 23.218 seconds

Ordered by: cumulative time
List reduced from 93 to 10 due to restriction <10>

240000   13.341    0.000   16.953    0.000 Dictionary.py:22(getValueIdForValue)
206997    3.196    0.000    3.196    0.000 :0(index)

Проблема в том, что это всего лишь маленький тест. В реальной прикладной среде эта функция будет вызываться несколько миллионов раз, что значительно увеличит время выполнения для этого.

Конечно, я мог бы унаследовать от python dict, но проблема с производительностью довольно похожа, поскольку мне нужно получить ключ заданного значения (в случае, если значение уже вставлено в словарь).

Поскольку я до сих пор не являюсь Python Pro, не могли бы вы дать мне какие-нибудь советы, как сделать это немного более эффективным?

Best & спасибо за помощь,

n3otec

===

Спасибо, ребята!

Производительность бидикта намного лучше:

  240000    2.458    0.000    8.546    0.000 Dictionary.py:34(getValueIdForValue)
  230990    1.678    0.000    5.134    0.000 Dictionary.py:27(insertValue)

Лучший, n3otec

1 Ответ

1 голос
/ 02 октября 2011

Если ключи и значения уникальны, вы можете использовать двунаправленный словарь. Существует один пакет Python здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...