首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有更快的方法吗?

有更快的方法吗?
EN

Stack Overflow用户
提问于 2015-02-14 00:57:12
回答 2查看 52关注 0票数 0

梯子有大约15000个元素,这个代码片段在5-8秒内执行,有什么方法可以更快地完成吗?我尝试不检查副本,也不创建accs列表,时间缩短到2-3秒,但我不需要重复csv文件。

我在python 2.7.9工作

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-14 01:15:22

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2015-02-14 01:12:29

您不能对循环做很多事情,因为毕竟您需要遍历ladder中的每个元素。但是,您可以改进此成员资格测试:

代码语言:javascript
复制
if element['account']['name'] not in accs:

由于accs是一个列表,这实际上将遍历accs的所有项,并检查名称是否在其中。然后对ladder中的每个元素进行循环,这样很容易就会变得效率低下。

相反,为accs使用一个集合而不是一个列表,因为这将为您提供一个常量的成员查询。因此,您可以将算法从二次复杂度降为线性复杂度。为此,只需使用accs = set()并将代码更改为使用accs.add()而不是append

另一个问题是,您正在进行字符串连接。每次执行someString + "something"时,都会丢弃该字符串对象并创建一个新对象。对于大量的操作来说,这也会变得效率低下。相反,在这里使用一个列表来收集您想要编写的所有元素,然后加入它们:

代码语言:javascript
复制
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模块。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28511231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档