有没有办法更快地做到这一点?

时间:2015-02-14 00:57:12

标签: python python-2.7

阶梯有大约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)

2 个答案:

答案 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))