Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2013 15:48:00

diz
Зарегистрирован: 2013-05-28
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

Добрый день!
Есть лог следующего вида:

69.94.xx.xx - - [03/Jun/2013:04:32:01 +0300] 
95.168.xx.xx - - [03/Jun/2013:04:32:0
69.94.xx.xx - - [03/Jun/2013:04:32:01 +0300]
95.168.xx.xx - - [03/Jun/2013:04:32:01 +0300]
176.119.xx.xx - - [03/Jun/2013:04:32:02 +0300]
86.105.xx.xx - - [03/Jun/2013:04:32:02 +0300]
69.94.xx.xx - - [03/Jun/2013:04:32:02 +0300] "
83.172.xx.xx - - [03/Jun/2013:04:32:03 +0300]
91.121.xx.xx - - [03/Jun/2013:04:32:04 +0300]
208.167.xx.xx - - [03/Jun/2013:04:32:04 +0300]
69.94.xx.xx- - [03/Jun/2013:04:32:04 +0300]
91.121.xx.xx - - [03/Jun/2013:04:32:04 +0300]
91.121.xx.xx - - [03/Jun/2013:04:32:04 +0300]
89.161.xx.xx - - [03/Jun/2013:04:32:05 +0300]
69.94.xx.xx - - [03/Jun/2013:04:32:05 +0300]

С горем пополам написал я следующий скрипт)

#!/usr/bin/env python

raw=[(x.split()[0]) for x in open("/home/user/access.log")]
e=0
raw2=[]
for elem in raw:
raw2.append((raw.count(raw[e]),raw[e]))
e+=1
raw2=set(raw2)
raw2=sorted(raw2)
e=0
for elem in raw2:
print (raw2[e])
e+=1

Он подсчитывает колличество запросов с одного айпи.. сортирует и выводит на экран. Но как-то долго)). При логфайле в 70-тыс строк, скрипт тратит 1мин17сек.

Может можно как-то оптимизировать?

З.Ы. Сильно не пинайте это мой первый скрипт))

Офлайн

#2 Июнь 3, 2013 16:13:24

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

sums = {}
for i in open("/home/user/access.log"):   
    b=i.split()[0]
    sums.setdefault(b, 0)
    sums[b] += 1
print sums
а так?

Отредактировано ilnur (Июнь 3, 2013 16:14:48)

Офлайн

#3 Июнь 3, 2013 16:15:17

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

Скрипт по сбору статистики "оптимизация"

Такие задачи решаются с помощью БД.



Офлайн

#4 Июнь 3, 2013 16:15:17

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

А так?

from collections import defaultdict
from operator import itemgetter
from pprint import pprint
def count(a, b):
    ip = b.split()[0]
    a[ip] += 1
    return a
with open('/home/user/access.log') as fd:
    counter = reduce(count, fd, defaultdict(int))
    pprint(sorted(counter.items(), key=itemgetter(1), reverse=True))

Отредактировано s0rg (Июнь 3, 2013 17:36:40)

Офлайн

#5 Июнь 3, 2013 17:16:18

diz
Зарегистрирован: 2013-05-28
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

ilnur
Работает ) выплевывает результат на ходу))
А как отсортировать по колличеству запросов?

s0rg
А так?
Не работает. Пишет
Traceback (most recent call last):
File "./split_2.py", line 10, in <module>
counter = reduce(count, data, defaultdict(int))
NameError: name 'data' is not defined

Офлайн

#6 Июнь 3, 2013 17:37:22

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

diz
Не работает. Пишет
упс, поправил. Перепроверяйте

Офлайн

#7 Июнь 4, 2013 02:50:05

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

from collections import Counter
from operator import itemgetter
from pprint import pprint
with open('/home/user/access.log') as fd:
    counter = Counter(line.split()[0] for line in fd)
pprint(sorted(counter.items(), key=itemgetter(1), reverse=True))



Офлайн

#8 Июнь 4, 2013 06:36:33

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

diz
А как отсортировать по колличеству запросов?
lsums = sorted(sums.items(), key=lambda x: x[1])

Офлайн

#9 Июнь 4, 2013 08:11:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

ilnur, itemgetter - твой друг, не надо так делать

key=lambda x: x[1]



Офлайн

#10 Июнь 4, 2013 08:47:48

diz
Зарегистрирован: 2013-05-28
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Скрипт по сбору статистики "оптимизация"

Всем спасибо!
По времени выполнения:
Лог файл 200000 линий.
pyuser 0m0.351s
ilnur 0m0.297s ( вывод идёт в строку)
s0rg 0m0.298s

Теперь буду изучать использованные вами функции.


Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version