首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python写出itertools

Python写出itertools
EN

Stack Overflow用户
提问于 2013-02-09 07:09:39
回答 1查看 375关注 0票数 0

我想在一行中手动写出itertools所做的事情,这样我就可以尝试使用多个字符串来更快地完成函数。现在这个函数起作用了,我只需要大大提高它的速度。我甚至不确定写出itertools行是否能让我使用多个线程。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-09 07:37:25

您的问题可能与IO有关。您可以通过使用多线程/进程来加速查找。为了避免dns实施中的线程问题,您可以使用多个进程来解析主机:

代码语言:javascript
复制
#!/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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14782831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档