Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 10, 2013 16:53:15

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Медленный парсинг файла

оказалось компилить не обязательно(если не мильён итераций), оно все равно кешируется первый раз при вызове глобальной функции

может регулярка не оптимальная, ты хоть на выходе результат правильный получаешь?

PS: кстати точки экранировать надо

Отредактировано bismigalis (Окт. 10, 2013 17:04:05)

Офлайн

#2 Окт. 10, 2013 20:52:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Медленный парсинг файла

#!/usr/bin/env python3
 
import re
 
ifname = 'file.txt'
 
pat = r';(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3});'
 
lst = []
with open(ifname, encoding='utf-8') as fin:
    for line in fin:
        match = re.search(pat, line)
        match and lst.append(match.group(1))
 
print(lst[:10])
print(len(lst))

[guest@localhost txtip]$ head -5 file.txt
12345;127.0.0.1;6789
12345;192.168.0.1;6789
12345;192.168.0.2;6789
12345;192.168.0.3;6789
12345;127.0.0.1;6789
[guest@localhost txtip]$ wc file.txt
9600 9600 216000 file.txt
[guest@localhost txtip]$ ./txtip.py
['127.0.0.1', '192.168.0.1', '192.168.0.2', '192.168.0.3', '127.0.0.1', '192.168.0.1', '192.168.0.2', '192.168.0.3', '127.0.0.1', '192.168.0.1']
9600
[guest@localhost txtip]$

за секунду примерно

хотя эта быстрее в двенадцать раз
#!/usr/bin/env python3
 
import re
 
ifname = 'file.txt'
 
pat = r';(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3});'
 
with open(ifname, encoding='utf-8') as fin:
    lst = [i.group(1) for i in filter(None, map(re.compile(pat).search, fin))]
 
print(lst[:10])
print(len(lst))



Отредактировано py.user.next (Окт. 10, 2013 21:11:49)

Офлайн

#3 Окт. 10, 2013 21:56:10

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Медленный парсинг файла

aborodin
Lexander, есть не нулевая вероятность что может появиться “лишний” разделитель в текстовом поле
Ну так и IPv6 может быть :)
aborodin
3. 832350 байт
Если это НЕ ежесекундно поступающие данные из внешнего источника, то - все в память и не мучиться.



Отредактировано Lexander (Окт. 10, 2013 21:56:27)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version