阶梯有大约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)
答案 0 :(得分:2)
你不能对循环做很多事情,因为毕竟你需要遍历ladder
中的每个元素。但是,您可以改进此成员资格测试:
if element['account']['name'] not in accs:
由于accs
是一个列表,因此这将基本上遍历accs
的所有项目,并检查名称是否在那里。然后你为ladder
中的每个元素循环,这样很容易变得非常低效。
相反,使用 set 而不是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
模块。
答案 1 :(得分:2)
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))