如何加快从网址中提取域名?

时间:2014-10-27 17:19:10

标签: python performance dictionary

我有以下脚本打开一个包含两列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)

2 个答案:

答案 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的建议也有助于提高代码速度。