首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用县代码解析文件

用县代码解析文件
EN

Code Review用户
提问于 2012-01-25 17:48:51
回答 1查看 176关注 0票数 2

我正在运行一个文件,并一个一个地插入元素。县都包含特定的县代码,这些代码在整个文件中重复多次。我正在寻找一种将这些代码分配给特定县的方法,同时忽略重复的县代码。

我在下面用运行时编写了两个版本:

getCodes()

代码语言:javascript
复制
def get_codes(data):
    code_info = {}
    for row in data:
        county = row["county"]
        code = int(float(row["code"]))
        if code > 100000:
            code = code/100
        if county not in code_info:
            code_info[county] = []
        code_info[county].append(code)
    for county in code_info:
        code_info[county] = list(set(code_info[county]))
    return code_info

get_codes2()

代码语言:javascript
复制
def get_codes2(data):
    code_info = {}
    for row in data:
        county = row["county"]
        code = int(float(row["code"]))
        if code > 100000:
            code = code/100

        if county in code_info:
            if not code in code_info[county]:
                code_info[county].append(code)
        else:
            code_info[county] = []
            code_info[county].append(code)
    return code_info
代码语言:javascript
复制
county_data = csv.DictReader(open("county_file.txt"))
start = time.time()
county_codes = get_codes(county_data)
end = time.time()
print "run time: " + str(end-start)

county_data = csv.DictReader(open("county_file.txt"))
start = time.time()
county_codes = get_codes2(county_data)
end = time.time()
print "run time: " + str(end-start)

而且,这可能很明显,但是大于100000的县代码可能会意外地添加尾随零,所以我用除以100去除它们。另一个注意事项是,int(float())转换是有意的。有时县代码是"27.7“这样的值,需要转换为"27",其他时候它们只是基本的ints。

我系统上的运行时:

  • get_codes:9秒
  • get_codes2:14秒

为了更好的性能,我如何进一步改进这一点?

EN

回答 1

Code Review用户

发布于 2012-01-25 18:49:47

我觉得你在这里很接近最佳状态。我做了一些调整,以避免一些条件,而不是使用集合。我不知道它是否运行得更快;你需要对它进行基准测试,这很可能取决于每个县有多少个哑弹。

代码语言:javascript
复制
def get_codes3(data):
    from collections import defaultdict
    codeinfo = defaultdict(set)
    for row in data:
        county = row["county"]
        # remove float() if you can get away with it - are there
        # actually values like '1.5' in the data?
        code = int(float(row["code"]))
        if code > 100000:
            code = code/100

        codeinfo[county].add(code)
    # if you can get away with sets instead of lists in your return
    # value, you're good
    return code_info
    # otherwise:
    # return dict([(county, list(info)) for county, info in code_info.iteritems()])
  • 您不需要float(),除非数据实际上类似于"123.45" --不清楚是否是这种情况
  • sets可以在大多数列出工作列表的地方工作,因此您可能不需要转换为列表。
  • 编写一个只执行x = x/100 if x > 100000部分并将其写入新文件的脚本可能是值得的。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/8284

复制
相关文章

相似问题

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