2

我对编程很陌生,不明白我的程序速度变慢的原因。

我正在处理大约 350,000 - 500,000 行的数据集,并希望得到一些指导。

我需要对照旧列表检查新列表中的所有条目,以便更新旧条目并将全新的条目添加到列表的末尾。

如果将打印语句添加到重新分配循环并且新行异常,则前几千次迭代很快,但之后程序变得非常慢。(在前 3 秒内完成了近 1000 个完整的循环,在大约第 20,000 次迭代之后,速度降低到低于 5 秒内的 100 个完整循环,到第 60,000 次迭代,它比 15 秒内的 100 个完整循环慢。)

RAM 的使用率低于 70%,而 CPU 一直保持在 48% 到 50% 之间

代码如下所示:

import gc
gc.disable() #this was added to possibly improve speed

def updateOldList(oldListOfLists, newListOfLists):
    oldListIndexDict = dict()
    IDNumber = <index of ID number>
    for i in range(len(oldListOfLists)):
        oldListIndexDict[oldList[i][IDNumber]] = i
    for i in range(len(newListOfLists)):
        try:
            oldIndex = oldListIndexDict[newListOfLists[i][IDNumber]]
            oldListOfLists[oldIndex][0] = newListOfLists[i][0]
            oldListOfLists[oldIndex][3] = newListOfLists[i][3]
            del(oldListIndexDict[newListOfLists[i][IDNumber]]) #this was added to limit the number of entries in the hash table to attempt to improve speed
        except:
            oldListOfLists= oldListOfLists + newListOfLists
return oldListOfLists

每个列表列表中的内部列表需要保持有序,所以我认为我不能使用集合。

以下两个问题非常相似,我在询问之前尝试/考虑了他们的评论。

python函数无明显原因变慢

Python函数因存在大列表而变慢

4

1 回答 1

3

好的,让我们使用 Python 3.3。我想 oldListOfLists 中的每个列表都应该是newListOfLists中的一个,并且您主要更新值,因此,例如,oldListOfLists 的第 0 个由 newListOfLists第 0 个、1ft 等更新- 相同的索引,你可以简化您的代码。

def updateOldList(oldListOfLists, newListOfLists):

    for i in range(lenNewListOfLists):
        try:            
            oldListOfLists[i][0] = newListOfLists[i][0]
            oldListOfLists[i][3] = newListOfLists[i][3]            
        except IndexError:
            oldListOfLists+=newListOfLists

return oldListOfLists

如果 oldListofLists 中的 a 列表没有被newListOfLists中具有相同索引的列表更新,那么它实际上不会很好地工作,你可以想象。

编辑:您可能想要捕获类似 IndexError 的内容,以防活动的新列表没有对应的旧列表,而其他的一般错误则没有。

Edit2 : += 是扩展的别名。

oldListOfLists+=newListOfLists

是相同的

oldListOfLists.extend(newListOfLists)  

Edit3:代码仍然变慢吗?您的最后一个列表(在索引中)是否变得越来越大?两个列表的总内存大小是多少?

于 2013-08-27T01:28:49.927 回答