Найти - Пользователи
Полная версия: Скрипт по сбору статистики "оптимизация"
Начало » Python для новичков » Скрипт по сбору статистики "оптимизация"
1 2
diz
Добрый день!
Есть лог следующего вида:
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сек.

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

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

ilnur
sums = {}
for i in open("/home/user/access.log"):   
    b=i.split()[0]
    sums.setdefault(b, 0)
    sums[b] += 1
print sums
а так?
Lexander
Такие задачи решаются с помощью БД.
s0rg
А так?
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))
diz
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
s0rg
diz
Не работает. Пишет
упс, поправил. Перепроверяйте
pyuser
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))
ilnur
diz
А как отсортировать по колличеству запросов?
lsums = sorted(sums.items(), key=lambda x: x[1])
FishHook
ilnur, itemgetter - твой друг, не надо так делать
key=lambda x: x[1]
diz
Всем спасибо!
По времени выполнения:
Лог файл 200000 линий.
pyuser 0m0.351s
ilnur 0m0.297s ( вывод идёт в строку)
s0rg 0m0.298s

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


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB