【发布时间】:2014-01-10 10:26:06
【问题描述】:
我有一个 Python 脚本来收集以素数为字节实体的 IP 地址的主机名。 例如,根据我的问题集,211.13.17.2 是一个有效的 ip,其中每个字节实体(十进制表示)都是质数。
代码:
from itertools import product
import socket
# prime or not
def prime(n):
if n > 1:
p = 0
for i in range(2, n-1):
if divmod(n, i)[1] == 0:
p = 1
break
if p == 0:
return True
def get_host_name(b1, b2, b3, b4):
addr = str(b1) + '.' + str(b2) + '.' + str(b3) + '.' + str(b4)
try:
return socket.gethostbyaddr(addr)
except socket.herror:
pass
# find host names whose ip addresses are all primes
byte = [b for b in range(0, 256) if prime(b)]
ips = list(product(byte, byte, byte, byte))
print 'Total ips = ', len(ips)
for ip in ips:
if get_host_name(*ip):
print get_host_name(*ip)
问题是我的脚本太慢了。我需要专家帮助来优化此代码。请指出所有错误以及使其表现更快的方法。
【问题讨论】:
-
学习使用 Python 分析器:docs.python.org/2/library/profile.html 并确定代码的哪个部分最慢。我希望您的代码中最慢的部分是对数千个 IP 地址的名称查找。
-
代码需要多长时间,你需要多长时间?唯一会产生显着差异(超过 2 倍)的是同时运行多个请求。所以你需要多线程或者多进程,或者异步DNS请求:catonmat.net/blog/asynchronous-dns-resolution
-
正如尼尔建议的那样:python -m cProfile myscript.py
标签: python sockets networking python-2.7 ip