我正在运行一个文件,并一个一个地插入元素。县都包含特定的县代码,这些代码在整个文件中重复多次。我正在寻找一种将这些代码分配给特定县的方法,同时忽略重复的县代码。
我在下面用运行时编写了两个版本:
getCodes()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_infoget_codes2()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_infocounty_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秒为了更好的性能,我如何进一步改进这一点?
发布于 2012-01-25 18:49:47
我觉得你在这里很接近最佳状态。我做了一些调整,以避免一些条件,而不是使用集合。我不知道它是否运行得更快;你需要对它进行基准测试,这很可能取决于每个县有多少个哑弹。
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部分并将其写入新文件的脚本可能是值得的。https://codereview.stackexchange.com/questions/8284
复制相似问题