2010-06-12 9 views
1

я пытался сделать полную массу изобр для тестирования с помощью этого кода:Слишком много значений проблемы

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-адресов. Если есть способ сделать все сразу или как можно сделать один раз ленивым способом? Я довольно noob на python: P.

Спасибо за помощь :)

ответ

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

Кроме того, попробуйте «% d% d% d% d: % d '% (i1, i2, i3, i4, p) для немного более аккуратного выражения. –

+0

В Python 2 '[i для i в диапазоне (256)]' можно написать просто как 'range (256)'. В Python 3 просто напишите 'list (range (256))'. – PaulMcG

+0

Это я использовал, и я ограничил его количеством ips, потому что это закончилось бы через 2 года -.- (и для этого было бы лучше перезапустить процесс в квантовом ПК: P). Большое спасибо! – DraskyVanderhoff

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)) 
+0

Это то, что я хочу, но для моего компьютера был самый хардкорный DOS. Даже мышь умерла. В любом случае, спасибо;) – DraskyVanderhoff

+0

Тогда вы разобрались что-то еще. Этот код этого не сделает. –

6

Вы пытаетесь (совершенно независимо от вопросов синтаксиса), чтобы составить список

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

строк - то есть 206708186021888 строки ... около двух сотен тысяч миллиардов строк.

Если вы сделали один за микросекунду, то вам понадобится 6.5 лет (даже если не считать проблемы с обнаружением петабайт ОЗУ до провести).

Я знаю, что вы хотите «сделать полную массу изобр для тестирования», но это способслишком полный много.

Почему бы не взять случайный образец из этого огромного набора, вместо этого? Например:

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

Полезный ответ. BTW, я получил сообщение об ошибке, когда я запустил код, поэтому добавил несколько parens: 'return format% (ip + (port,))'. Я предполагаю, что это проблема с приоритетом - '' 'связывание более тесно, чем' + '? Но я начинающий Python, поэтому, возможно, я в замешательстве. – FMc

+0

@FM, нет, вы правы, спасибо - +1, и я редактирую A, чтобы исправить отсутствие круглых скобок!) –

+0

Вы правы, это было очень дампом с моей стороны, чтобы попробовать это. Я использую его генератор случайных строк, что-то очень похожее на то, что вы делаете, но я хочу дать ему попробовать и найти ленивый способ. Спасибо за совет, я буду более уважительно относиться к своим 4Gigs: P – DraskyVanderhoff

Смежные вопросы