我正在阅读一个大型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
我的问题是时间戳,我无法正确地减少时间和节省时间。
答案 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后,您不再需要该设置,因此不会影响压缩大小。