梯子有大约15000个元素,这个代码片段在5-8秒内执行,有什么方法可以更快地完成吗?我尝试不检查副本,也不创建accs列表,时间缩短到2-3秒,但我不需要重复csv文件。
我在python 2.7.9工作
accs =[]
with codecs.open('test.csv','w', encoding="UTF-8") as out:
row = ''
for element in ladder:
if element['account']['name'] not in accs:
accs.append(element['account']['name'])
row += element['account']['name']
if 'twitch' in element['account']:
row += "," + element['account']['twitch']['name'] + ","
else:
row += ",,"
row += str(element['account']['challenges']['total']) + "\n"
out.write(row)发布于 2015-02-14 01:15:22
seen = set()
results = []
for user in ladder:
acc = user['account']
name = acc['name']
if name not in seen:
seen.add(name)
twitch_name = acc['twitch']['name'] if "twitch" in acc else ''
challenges = acc['challenges']['total']
results.append("%s,%s,%d" % (name, twitch_name, challenges))
with codecs.open('test.csv','w', encoding="UTF-8") as out:
out.write("\n".join(results))发布于 2015-02-14 01:12:29
您不能对循环做很多事情,因为毕竟您需要遍历ladder中的每个元素。但是,您可以改进此成员资格测试:
if element['account']['name'] not in accs:由于accs是一个列表,这实际上将遍历accs的所有项,并检查名称是否在其中。然后对ladder中的每个元素进行循环,这样很容易就会变得效率低下。
相反,为accs使用一个集合而不是一个列表,因为这将为您提供一个常量的成员查询。因此,您可以将算法从二次复杂度降为线性复杂度。为此,只需使用accs = set()并将代码更改为使用accs.add()而不是append。
另一个问题是,您正在进行字符串连接。每次执行someString + "something"时,都会丢弃该字符串对象并创建一个新对象。对于大量的操作来说,这也会变得效率低下。相反,在这里使用一个列表来收集您想要编写的所有元素,然后加入它们:
row = []
row.append(element['account']['name'])
if 'twitch' in element['account']:
row.append(element['account']['twitch']['name'])
else:
row.append('')
row.append(str(element['account']['challenges']['total']))
out.write(','.join(row))
out.write('\n')或者,由于您正在写入一个文件,所以您可以使用每个字符串部分多次调用out.write。
最后,如果您对编写CSV数据感兴趣,也可以查看csv模块。
https://stackoverflow.com/questions/28511231
复制相似问题