У меня небольшая проблема с производительностью, когда одна из моих структур данных используется для большого проекта в 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