我有以下脚本打开一个包含两列ip,domain
的文件e.g 108.170.206.91|.com.invitemedia.prod2.pixel
并首先尝试尊重域名,因为它是以fns形式,然后通过公共后缀模块提取第二级域名
`e.g invitemedia.com`
效果很好,但有点慢,有人可以帮助我加快速度吗?
这是我的剧本:
psl = PublicSuffixList()
d = {}
f = open(file, 'r')
for n, line in enumerate(f):
ip,reversed_domain_1= line.split('|')
try:
reversed_domain_2 = reversed_domain_1.split('.')
reversed_domain_3 = list(reversed(reversed_domain_2))
domain = ('.'.join(reversed_domain_3)).strip('.')
domain = psl.get_public_suffix(domain)
assert domain
if ip in d:
d[ip].add(domain)
else:
d[ip] = set([domain])
except:
print (domain)
continue
for ip,domain in d.iteritems():
print("%s|%d" % (ip, domain), file = output)
答案 0 :(得分:1)
您可以对正在处理的d
变量使用默认字典。如果您执行切片而不是reverse
和类似的切片,也可能有更好的性能。
from collections import defaultdict
d = defaultdict(set) # You can now treat it like every key is always present
...
domain = '.'.join(input.split('.')[2:0:-1])
默认dict表示在处理密钥之前无需检查密钥是否存在:
d = defaultdict(set)
d[1].add(2)
答案 1 :(得分:1)
您的代码指的是(大概)全球psl
,您不提供任何有关的详细信息。我认为表现并不令人不满意。
不需要list()
调用,因为join()
字符串方法将完美地处理返回的迭代器。
strip()
电话是否严格必要?它的存在意味着您的数据包含前导和/或尾随点。如果情况确实如此,那么在分割reversed_domain_
1而不是之后,你将通过剥离获得(可能是微不足道的)加速。
@Matthew Franglen关于使用collections.defaultdict
的建议也有助于提高代码速度。