我正在尝试使用此代码制作大量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]
问题是第3行是ip列表。如果有办法立刻完成所有工作或者如何以懒惰的方式制作一个? 我在python上很漂亮:P。
感谢您的帮助:)
答案 0 :(得分:6)
您正在尝试(远离语法问题)制作
列表256 * 256 * 256 * 256 * (49152 - 1024)
字符串 - 即206708186021888字符串......大约20亿字符串。
如果你每微秒制作一个,那将花费你6。5年(甚至相当于找到数PB的RAM来持有它们的问题。)
我知道你想“为测试制作大量的ips”,但方式 太多了。
为什么不从这个庞大的集合中随机抽取样本呢? E.g:
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)]
答案 1 :(得分: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
这样你就不会耗尽内存,但迭代所有这些地址仍需要很长时间。
答案 2 :(得分: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))