Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何加快从url提取域的速度?_Python_Performance_Dictionary - Fatal编程技术网

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

Python 如何加快从url提取域的速度?,python,performance,dictionary,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 enumer

我有下面的脚本,它打开了一个文件,其中包含两列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)

您可以为正在处理的
d
变量使用默认dict。如果执行切片操作,而不是执行
反向操作
或类似操作,则性能可能会更好

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)
您的代码引用了一个(大概)全局
psl
,您没有提供任何详细信息。我想这并不是表现令人不满意的地方

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

strip()
调用是否严格必要?它的存在意味着您的数据包含前导点和/或尾随点。如果确实是这样,那么在拆分
reversed\u domain\uu
1`之前而不是之后,通过剥离,您将获得(可能很小的)加速


关于使用
collections.defaultdict
的建议也将有助于加快您的代码速度。

您能否在此详细说明默认键的优势?我没有完全理解。我认为切片的事情不适用,因为我不知道域级别(可能有多少个点),你说你想要第二级域,举了
invitemedia.com
.com.invitemedia.prod2.pixel
的例子。所以我假设你一直想要前两个元素。(刚刚回顾这一点,我意识到我的切片倒过来了,呵呵)集合框架将自己描述为“高性能容器数据类型”,因此
defaultdict
至少不比现有代码差,而且可能更好。谢谢你对defaultdict的解释,我明白了。我之所以使用相反的方法,是因为我不知道TLD是什么,因为它可以是something.com或something.co.uk或something.com.au等。在这种情况下,您可能希望使用
reduce
或类似方法来使用域名的每个部分,直到形成可接受的顶级域+子域。示例:您的输入看起来是什么样的,您似乎正在进行大量的方法调用?我会忘记逆转,只是分裂然后加入
spl=“.com.google.mail.www.split(“.”).join((spl[1:[::-1]))
用于f:print“.”中的行。join(line.split('.'))[1:3][::-1])split在这里不起作用,因为域级别的长度(点数)不同