价值太多的问题

Dra*_*off 1 python

我试图使用此代码进行大量的ips测试:

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]
Run Code Online (Sandbox Code Playgroud)

问题是第3行是ip列表.如果有办法立刻完成所有工作或者如何以懒惰的方式制作一个?我在python上很漂亮:P.

谢谢您的帮助 :)

Ale*_*lli 6

你正在尝试(完全不同于语法问题)来制作一个列表

256 * 256 * 256 * 256 * (49152 - 1024)
Run Code Online (Sandbox Code Playgroud)

字符串 - 即206708186021888字符串......大约20亿字符串.

如果你每微秒制作一个,那将花费你6.5年(甚至相当于找到数PB的RAM来保存它们的问题).

我知道你想"做一个完整的很多IPS的测试",但是这方式 满了很多.

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

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,))
Run Code Online (Sandbox Code Playgroud)

现在,如果您想要(例如)一百万个这样的字符串进行测试,那么就这样做:

millionstrings = [random_address() for i in xrange(1000*1000)]
Run Code Online (Sandbox Code Playgroud)


sth*_*sth 5

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

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
Run Code Online (Sandbox Code Playgroud)

这样你就不会耗尽内存,但是迭代所有这些地址仍然需要很长时间.

  • 另外,尝试'%d.%d.%d.%d:%d'%(i1,i2,i3,i4,p)以获得稍微更整洁的表达. (2认同)

Ign*_*ams 5

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))
Run Code Online (Sandbox Code Playgroud)