值太多问题

2024-05-23 17:02:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用这段代码做大量的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]

问题是第三行的ip列表。如果有一种方法可以一次完成所有任务,或者怎样才能以一种懒惰的方式一次完成一个任务呢? 我对python很在行:P

感谢您的帮助:)


Tags: 代码inipforreturnisportrange
3条回答
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))

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

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

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

您正在尝试(除了语法问题之外)列出

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

字符串,即206708186021888字符串。。。大约二十几亿根弦。在

如果你每微秒产生一个,那将花费你6.5年的时间(甚至与找到数PB的RAM来保存这些内存的问题相比,这是一个相当大的问题)。在

我知道你想“做一大堆IP来测试”,但那是一个非常好的方法。在

为什么不从这个大样本中随机抽取一个样本呢?E、 g.:

^{pr2}$

现在,如果您想要(例如)一百万个这样的字符串用于测试,只需执行以下操作:

millionstrings = [random_address() for i in xrange(1000*1000)]

相关问题 更多 >