单子能应付一百万个项目吗?

2024-03-29 09:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python2.6(*)开发一个数据处理应用程序。我的测试数据非常小,比如5000个案例,但是预计在不久的将来会有100万个案例,我想知道我目前的方法在这些条件下是否可行。在

问题结构: 我有两个csv文件,一个包含调用(5000行,20列),另一个包含调用的详细信息(500行,10列)。我必须建立第三个csv文件,其中将包含所有的案件从“调用”文件,在那里找到更多的细节。在幕后有一些繁重的工作正在进行(合并和重组细节列表中的数据,列表之间的数据比较)。 但我对构建输出列表非常紧张:目前代码如下:

def reduceOutputListToPossibleMatches(outputList, detailsList):
    reducedList = list()

    for outputItem in outputList:
        isFound = False
        for detailsItem in detailsList:
            if detailsItem[14] == outputItem[4]:
                if isfound:
                    detailsItem[30] = "1" #ambigous case
                                          # - more than one match was found
# 1 is an indicator for true - I am not using python here because spss has no support for booleans.
                isFound = True
        if isFound:
            reducedList.append(detailsItem )

    return reducedList

我认为这个算法需要很长时间,因为我必须循环两个大的列表。 所以我的问题可以归结为:Python中的列表速度有多快,还有更好的替代方法吗?另外:双列表有些不方便处理,因为我必须记住每个列的索引位置-有更好的替代方法吗?在

*=稍后我将调用spssversion19,后者拒绝使用较新版本的python。在


Tags: 文件csv数据方法列表forif细节
2条回答

根据Elazar的回答,使用dict来避免内部循环:

def reduceOutputListToPossibleMatches(outputList, detailsList):
    details = {}
    for detailsItem in detailsList:
        key = detailsItem[14]
        if key in details:
            details[key][30] = "1"
        else:
            details[key] = detailsItem

    for outputItem in outputList:
        key = outputItem[4]
        if key in details:
            yield details[key]

res = reduceOutputListToPossibleMatches(outputList, detailsList)
with open('somefile', 'w') as f:
    f.writelines(res)

如果您需要所有不明确的行:

^{pr2}$

我认为您不需要返回list。你可以这样做:

def reduceOutputListToPossibleMatches(outputList, detailsList):
    for outputItem in outputList:
        isFound = False
        for detailsItem in detailsList:
            if detailsItem[14] == outputItem[4]: #there was a syntax error here
                if isfound:
                    detailsItem[30] = "1"
                    break
                isFound = True
        else:
            yield detailsItem

res = reduceOutputListToPossibleMatches(outputList, detailsList)
with open('somefile', 'w') as f:
    f.writelines(res)

但它仍然是O(n**2),速度相当慢。也许是一个SQL数据库(通过Django?)会更适合这个任务。在

对@Duncan建议的小改动:

^{pr2}$

相关问题 更多 >