代码之家  ›  专栏  ›  技术社区  ›  DraskyVanderhoff

值太多问题

  •  1
  • DraskyVanderhoff  · 技术社区  · 14 年前

    我尝试使用以下代码制作大量的IP进行测试:

    ip_is = [i for i in range(256)]
    ports = [i for i in range(1024,49152)]
    return [str(i1)+"."+str(i2)+"."+str(i3)+"."+str(i4)+":"+str(p) for i1,i2,i3,i4,port in ip_is,ip_is,ip_is,ip_is,ports]
    

    感谢您的帮助:)

    3 回复  |  直到 14 年前
        1
  •  5
  •   sth    14 年前

    应使用生成器而不是创建完整列表:

    def all_addresses():
       ip_is = [i for i in range(256)]
       ports = [i for i in range(1024,49152)]
       # note (...) instead of [...] to create a generator instead of a list;
       # separate |for|s to iterate over the lists individually
       return (str(i1)+"."+str(i2)+"."+str(i3)+"."+str(i4)+":"+str(p)
                for i1 in ip_is
                for i2 in ip_is
                for i3 in ip_is
                for i4 in ip_is
                for p in ports)
    
    for addr in all_addresses():
       print addr
    

    这样您就不会耗尽内存,但遍历所有这些地址仍然需要非常、非常长的时间。

        2
  •  6
  •   Alex Martelli    14 年前

    256 * 256 * 256 * 256 * (49152 - 1024)
    

    字符串--即206708186021888字符串。。。大约二十亿根弦。

    如果你每微秒做一个,那就要花6.5年的时间(甚至除了寻找PB级内存来存储数据的问题) 他们)。

    我知道你想“做一个完整的IP测试”,但那是 方式 满满的。

    为什么不从这个大集合中随机抽取一个样本呢?例如。:

    import random
    
    def random_address():
      ip = tuple(random.randrange(256) for i in range(4))
      port = random.randrange(1024, 49152)
      format = '.'.join(['%s'] * 4) + ':%s'
      return format % (ip + (port,))
    

    millionstrings = [random_address() for i in xrange(1000*1000)]
    
        3
  •  5
  •   Ignacio Vazquez-Abrams    14 年前
    return ('%d.%d.%d.%d:%d' % (i1, i2, i3, i4, port) for i1, i2, i3, i4, port in itertools.product(ip_is, ip_is, ip_is, ip_is, ports))