Форум сайта python.su
0
Всем привет.
Есть текстовый файл, в каждой строка
число;строка;ip-адрес;число
Всего 9600 строк. Я выбираю только ip-адреса следующим образом
for text in file.readlines(): text = text.rstrip() regex = re.findall(';[0-2]?[0-9][0-9]?.[0-2]?[0-9][0-9]?.[0-2]?[0-9][0-9]?.[0-2]?[0-9][0-9]?;', text) if regex is not None and regex not in ips: ips.append(regex)
Офлайн
47
вынеси из цикла создание регулярки
Офлайн
0
сделал так
regex_ = re.compile(';[0-2]?[0-9][0-9]?.[0-2]?[0-9][0-9]?.[0-2]?[0-9][0-9]?.[0-2]?[0-9][0-9]?;') for text in file.readlines(): text = text.rstrip() regex = re.findall(regex_, text) if regex is not None and regex not in ips: ips.append(regex) print(time.time()-ts)
Офлайн
568
if regex is not None and regex not in ips:
if not regex in ips:
l = range(10000) s = set(range(10000)) def list_test(): return 5088 in l def set_test(): return 5088 in s if __name__ == '__main__': import timeit print(timeit.timeit("list_test()", setup="from __main__ import l, list_test", number=1000)) print(timeit.timeit("set_test()", setup="from __main__ import s, set_test", number=1000 ))
0.0621750354767 0.000143051147461
Офлайн
33
Зачем regex, если известен разделитель полей?
tuple(text.rstrip().split(";"))
Офлайн
47
вызывай метод на созданном объекте регулярки
Офлайн
0
FishHook, я попробую как осмыслю чем это может обернуться.
Lexander, есть не нулевая вероятность что может появиться “лишний” разделитель в текстовом поле
1. python 3.2
3. 832350 байт
Офлайн
0
Небольшая оптимизация использования памяти:
file.readlines() - читает все строки в list.
For reading lines from a file, you can loop over the file object. This is memory efficient, fast, and leads to simple code:>>> for line in f: print line,
Офлайн
43
re.findall возвращает список, эти вычисления:
regex not in ips: ips.append(regex)
text = text.rstrip()
Офлайн
0
Раз айпишники все равно уникальные, можно хранить в словаре, там гораздо быстрее лукапы делаются. Плюс непонятно зачем регулярка. Допустим вы не можете сделать сплит, потому что во второй колонке могут встречаться точки с запятой, тогда можно сделать индекс с конца.
Как-то так:
ips = {} for line in f.readlines(): ips[line.split(';')[-2]] = None ips = ips.keys()
Офлайн