簡體   English   中英

Python腳本,僅使用主要實體收集IP地址的所有主機名

[英]Python script to collect all hostnames of ip addresses with only prime entities

我有一個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)

問題是我的腳本太慢了。 我需要專家幫助來優化此代碼。 請查明所有錯誤和使其更快運行的方法。

對於質數,您可以使用類似這樣的方法,

import numpy as np
isprime = lambda x: np.all(np.mod(x, range(2, 1 + int(np.sqrt(x)))))
primes = np.array([ x for x in range(2, 255) if isprime(x) ])

您可以通過以下方式為IP地址生成一個

('{}.{}.{}.{}'.format(*x) for x in itertools.product(primes, repeat=4))

但是最有可能代碼在socket部分運行緩慢,並且由於需要檢查的組合數量過多; 為此,您可以使用工作進程池來嘗試並行處理; 像這樣的東西:

from multiprocessing import Pool
from socket import gethostbyaddr

def gethost(addr):
    try:
        return gethostbyaddr(addr)
    except:
        pass

if __name__ == '__main__':

    p = Pool(3)
    print (p.map(gethost,['74.125.228.137',
                          '11.222.333.444',
                          '17.149.160.49',
                          '98.139.183.24']))

編輯 :對於僅小於50的質數((50K +個組合)和20個工作進程),在我的機器上花費了將近6分鍾,並且發現了16K +個結果。 因此,使用如此眾多的組合,並行性無濟於事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM