Python 为什么我的节目要花这么长时间?

Python 为什么我的节目要花这么长时间?,python,Python,我正在处理一个大的txt文件,总共有8050000行。这些行的一个简短示例是: usedfor zipper fasten_coat usedfor zipper fasten_jacket usedfor zipper fasten_pant usedfor your_foot walk atlocation camera cupboard atlocation camera drawer atlocation camera house relatedto more plenty 我编写了一

我正在处理一个大的txt文件,总共有8050000行。这些行的一个简短示例是:

usedfor zipper fasten_coat
usedfor zipper fasten_jacket
usedfor zipper fasten_pant
usedfor your_foot walk
atlocation camera cupboard
atlocation camera drawer
atlocation camera house
relatedto more plenty
我编写了一个python代码来读取这些行,并将它们存储为字典。我的代码是:

dicCSK = {} 
for line in finCSK:
    line=line.strip('\n')
    try:
        r, c1, c2 = line.split(" ")
    except ValueError: print line
    if c1 not in dicCSK.keys():
        dicCSK[c1]= []
    str1 = r+" "+c2
    dicCSK[c1].append(str1)

然而,我运行了20多个小时的程序,它仍然在运行。那么,有没有更好的方法将它们存储在字典中呢?我的代码太慢了。谢谢。

这是一个错误:它生成字典中所有键的列表,然后扫描它

if c1 not in dicCSK.keys():
    dicCSK[c1]= []
相反:

if c1 not in dicCSK:
    dicCSK[c1] = []
或者,使用
defaultdict
来避免检查

dicCSK = collections.defaultdict(list)
for line in finCSK:
    line=line.strip('\n')
    try:
        r, c1, c2 = line.split(" ")
    except ValueError:
        print line
    dicCSK[c1].append(r+" "+c2)

此外,您可能还希望在
try/except
else
子句下附加(r+“”+c2)语句,否则即使出现
ValueError
异常,它也会执行。

这是一个错误:它生成字典中所有键的列表,然后扫描它

if c1 not in dicCSK.keys():
    dicCSK[c1]= []
相反:

if c1 not in dicCSK:
    dicCSK[c1] = []
或者,使用
defaultdict
来避免检查

dicCSK = collections.defaultdict(list)
for line in finCSK:
    line=line.strip('\n')
    try:
        r, c1, c2 = line.split(" ")
    except ValueError:
        print line
    dicCSK[c1].append(r+" "+c2)


此外,您可能还需要
dicCSK[c1]。在
try/except
else
子句下追加(r+“”+c2)
语句,否则即使出现
ValueError
异常,它也会执行。

我投票将此问题作为非主题来结束,因为这是在要求代码复查,因此它属于旁白:我可能会为这项特殊的工作选择一种不同的工具(和存储格式)——具体取决于对生成的词典所做的操作。旁白[2]:
collections.defaultdict(list)
可以避免dicCSK.keys()中的
c1检查。@jarrodrobson是这样吗?我不会考虑任何“20小时”的工作,除非它真的能处理大量的数据(8M是很多,但不是20小时)。我不同意这是要求代码审查:代码有一个特定的问题——它太慢了。我投票把这个问题关闭,因为这是一个要求代码审查,因此它属于旁白:我可能会为这项特殊的工作选择一种不同的工具(和存储格式)——具体取决于对生成的词典所做的操作。旁白[2]:
collections.defaultdict(list)
可以避免dicCSK.keys()中的
c1检查。@jarrodrobson是这样吗?我不会考虑任何“20小时”的工作,除非它真的能处理大量的数据(8M是很多,但不是20小时)。我不同意这是要求代码审查:代码有一个特定的问题——它太慢了。谢谢你的回答,它现在更快了。但是,我的程序因错误而终止:
MemoryError
。因为我有四个大文件。它发生在程序开始处理第二个文件时。我的计算机有8GBmemory@flyingmouse好的,但这听起来像是另一个问题。如果这个答案令人满意地回答了你提出的问题,也许可以接受它,然后用新问题开始一个新问题(假设它足够清晰和具体)。感谢你的回答,新问题是:谢谢你的回答,现在更快了。但是,我的程序因错误而终止:
MemoryError
。因为我有四个大文件。它发生在程序开始处理第二个文件时。我的计算机有8GBmemory@flyingmouse好的,但这听起来像是另一个问题。如果此答案令人满意地回答了您提出的问题,或许可以接受此答案,并用新问题开始新问题(假设它足够清晰和具体)。感谢您的回答,新问题是: