【问题标题】:Python 3.3 Slowing Down During Large LoopPython 3.3 在大循环期间减速
【发布时间】:2013-04-22 19:22:22
【问题描述】:

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

我正在处理大约 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

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

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

python function slowing down for no apparent reason

Python function slows down with presence of large list

【问题讨论】:

  • 如果删除gc.disable() 会怎样?一样吗?
  • 我原来是这样的,加了小有收获。
  • 不要使用空的 except: 子句,准确列出您想要捕获的内容以隐藏错误。乍一看,我担心的是您的 old = old+new 行在每次循环迭代时都会复制和销毁越来越大的列表。请改用 old.extend(new)。
  • 这解决了这个问题。如果您重新提交此问题作为答案,我会将问题标记为已回答。谢谢

标签: performance list dictionary python-3.x


【解决方案1】:

好的,让我们使用 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 中的一个列表没有被 newListOfLists 中具有相同索引的一个列表更新,它实际上不会很好地工作,你可以想象。

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

Edit2 : += 是扩展的别名。

oldListOfLists+=newListOfLists

相同
oldListOfLists.extend(newListOfLists)  

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2021-06-29
    相关资源
    最近更新 更多