处理在python中优化的for循环中的大整数

时间:2016-07-31 22:06:50

标签: python for-loop optimization integer iteration

我正在阅读一个大型csv文件(500 000行)并添加dict中的每一行。 一个示例行是:

6AH8,F,B,0,60541765,60541765,90.52,1

索引4 - 60541765和索引5 - 60541765在这种情况下是相同的,但情况并非总是如此。这些整数是表示时间的时间戳 以毫秒 - 午夜后格式

我想遍历每一行,并在列表中添加大号并将该号码写入列表索引。

即:

timeList = [60541765, 20531765, ..., 80542765]

所以行将是:6AH8,F,B,0,0,0,90.52,1

为什么? - 因为时间有时会在文件中出现多次。

Myquestion是:

有没有比将它们存储在列表中更好的方法?

如果不是:

如何迭代行,以最快的方式替换索引4和5 - 现在需要超过15分钟。

我现在这样做:

timeStampList = []
def putTimeStampsInList(inputDict):
  for values in inputDict.values():
      timestamp1 = values[4]

      if values[4] not in timeStampList:
          timeStampList.append(values[4])

----------------------- 其他信息 --------------- --------

这是一个赋值,我应该使用压缩来缩小19MB文件而不使用任何第三方或框架为您的解决方案提供压缩库。所以我不能使用huffman或lz77并复制它。

我已经有了一个最小化

的解决方案
index 1 - 6AH8

index 2 and 3 - F,B

我的问题是时间戳,我无法正确地减少时间和节省时间。

1 个答案:

答案 0 :(得分:1)

您的问题很可能是检查数字是否在python中的List中是一个O(n)操作,需要对大数据集中的每一行执行,这意味着总共O(n ^ 2)算法,在500,000个条目上是巨大的。

我的建议是添加一些空间复杂度O(n)以节省时间复杂度(现在使其成为平均情况O(n),我认为在典型数据上)

timeStampList = []
timeStampSet = set()
def putTimeStampsInList(inputDict):
  for values in inputDict.values():
      timestamp1 = values[4]

      if values[4] not in timeStampSet:
          timeStampList.append(values[4])
          TimeStampSet.add(values[4])

现在检查成员身份是一个恒定的时间操作,因此,每次需要检查列表中是否有某些内容时,您的代码不会在您的巨大列表中循环,而是可以快速检查它是否在您的集合中重新创造!这样可以大大加快算法的使用时间。

创建完List后,您不再需要该设置,因此不会影响压缩大小。

相关问题