如何加快从url中提取域的速度?

2024-04-19 19:01:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的脚本打开一个文件,其中包含两列ip,域

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)

Tags: 文件inip脚本comfordomainline
2条回答

您的代码引用了一个(大概)全局psl,您没有提供任何详细信息。我想这并不是表现不令人满意的地方。你知道吗

不需要list()调用,因为join()string方法可以很好地处理返回的迭代器。你知道吗

strip()调用严格必要吗?它的存在意味着您的数据包含前导点和/或尾随点。如果确实是这样的话,那么在分割reversed_domain_1`之前而不是之后进行剥离,就可以获得(可能很小的)加速。你知道吗

@Matthew Franglen关于使用collections.defaultdict的建议也有助于加快代码的速度。你知道吗

您可以为正在处理的d变量使用默认dict。如果执行切片而不是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)

相关问题 更多 >