性能瓶颈与python映射数据结构

时间:2011-10-01 20:02:13

标签: python list dictionary mapping

我在python中用于更大项目的一个数据结构面临一点性能问题。

基本上,我正在导入表格分隔文件。使用普通的python open(...)文件迭代器我用line.split(“\ t”)拆分行。现在我希望将列的实际值插入某种字典中,返回值的ID。而且它变慢了:

一般来说 - 字典类看起来像这样:

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&amp;谢谢你的帮助,

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 个答案:

答案 0 :(得分:1)

如果键和值是唯一的,则可以使用双向字典。有一个python包here