2014-10-27 51 views
0

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

你输入的是什么样子,你似乎在做很多方法调用?我会忘记逆转,只是分裂然后加入。 'spl。“.split(”。“)”。“。join((spl [1:] [:: - 1]))' – 2014-10-27 17:48:18

+0

for line in f:print”。 “.join(line.split('|')[1] .split('。')[1:3] [:: - 1]) – kums 2014-10-27 17:55:04

+0

Split在此处不起作用导致域级别的长度(点数)是不同的 – UserYmY 2014-10-27 18:09:46

回答

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]) 

默认字典意味着你不需要检查的关键处理之前存在:

d = defaultdict(set) 
d[1].add(2) 
+0

你能详细阐述一下默认密钥的优点吗?我完全不明白。我认为切片的事情是不适用的,因为我不知道域级别(有多少点可能在那里) – UserYmY 2014-10-27 17:37:02

+0

你说你想要第二级域名,给出'.com'的'invitemedia.com'的例子。 invitemedia.prod2.pixel'。所以我认为你总是想要前两个元素。 (刚刚回顾一下,我意识到我已经把它切片了)hello) – 2014-10-28 09:31:54

+1

集合框架将自身描述为“高性能容器数据类型”,所以defaultdict至少不会比现有代码差,可能会更好。见https://docs.python.org/2/library/collections.html – 2014-10-28 09:40:36

1

你的代码是指(大概)全球psl你不提供任何关于的细节。我认为这不是性能证明不够好的地方。

由于join()字符串方法将很好地处理返回的迭代器,因此不需要调用list()

是否需要strip()调用?它的存在意味着您的数据包含前导和/或尾随点。如果确实如此,那么在拆分reversed_domain_ 1`之前,您将通过剥离获得(可能极小的)加速,而不是之后。

关于使用collections.defaultdict的建议@Matthew Franglen也有助于加快您的代码。