2014-10-27 93 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也有助於加快您的代碼。