0

複数の文字列を使用して関数をより迅速に処理できるように、itertools の機能を 1 行に手動で書き出したいと思います。現在、この関数は機能していますが、大幅に高速化する必要があります。itertools の行を書き出すことで複数のスレッドを使用できるようになるかどうかは、私にはよくわかりません。

def list ():
charLength = sys.argv[2]
charSet = 'abcdefghijklmnopqrstuvwxyz0123456789'

combo = itertools.combinations_with_replacement(charSet, int(charLength))
for floatingcombo in combo:
    floatingcombo = ''.join(floatingcombo)
    floatingcombo += "." + sys.argv[3]
    try:
        floatingIP = socket.gethostbyname(floatingcombo)
        msvcrt.printf("%s resolved to --> %s\n", floatingcombo, floatingIP)
    except socket.gaierror:
        msvcrt.printf("%s does not exist\n", floatingcombo)
return
4

1 に答える 1

2

あなたの問題はおそらくIOバウンドです。複数のスレッド/プロセスを使用すると、ルックアップを高速化できます。DNS 実装でのスレッド化の問題を回避するには、複数のプロセスを使用してホストを解決できます。

#!/usr/bin/env python
import itertools
import socket
import sys
from functools import partial
from multiprocessing import Pool

def resolve(host, domain=""):
    host = ''.join(host) + domain
    try:
        return host, socket.gethostbyname(host), None
    except EnvironmentError as e:
        return host, None, e

def main():
    alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789'
    size = int(sys.argv[2])
    resolve_host = partial(resolve, domain="." + sys.argv[3])
    combo = itertools.combinations_with_replacement(alphabet, size)

    pool = Pool(20) 
    for host, ip, error in pool.imap_unordered(resolve_host, combo):
        if error is None:
           print("%s resolved to --> %s" % (host, ip))
        else: # error
           print("Can't resolve %s, error: %s" % (host, error))

if __name__=="__main__":
   main()
于 2013-02-08T23:37:24.967 に答える