Скорость Питона при подсчете
Здравствуйте! Есть файл текстовый файл такого типа:
2016.02.22 16:51:29.030;1,10242;1,10238;4,87;1
2016.02.22 16:51:29.629;1,10242;1,10239;8,62;1
2016.02.22 16:51:30.135;1,10242;1,10239;4,5;1
2016.02.22 16:51:30.539;1,10243;1,10241;1,57;1
2016.02.22 16:51:31.089;1,10244;1,10241;5,62;1,5
2016.02.22 16:51:31.646;1,10244;1,10242;5,62;1
2016.02.22 16:51:33.080;1,10245;1,10241;1,37;4,95
2016.02.22 16:51:33.582;1,10244;1,10242;1,12;1
2016.02.22 16:51:51.951;1,10244;1,10241;4,12;2,32
2016.02.22 16:52:25.741;1,10244;1,10242;1,87;1
2016.02.22 16:52:36.246;1,10243;1,10242;1;1
2016.02.22 16:52:36.803;1,10244;1,10242;4,12;1
2016.02.22 16:52:37.345;1,10244;1,10241;4,12;2,7
2016.02.22 16:52:39.969;1,10244;1,10242;1,87;1
2016.02.22 16:52:40.497;1,10245;1,10243;8,62;1
2016.02.22 16:52:40.700;1,10245;1,10241;4,12;2,32
2016.02.22 16:51:41.603;1,10244;1,10242;1,12;1
2016.02.22 16:53:42.892;1,10244;1,10241;1,12;3,82
2016.02.22 16:53:43.434;1,10244;1,10241;4,12;3,45
2016.02.22 16:53:44.092;1,10244;1,10242;3,37;1
2016.02.22 16:53:44.698;1,10244;1,10241;3,37;3,07
2016.02.22 16:53:45.999;1,10242;1,1024;1;6,75
2016.02.22 16:53:46.504;1,10243;1,1024;4,5;4,57
2016.02.22 16:54:47.045;1,10243;1,10241;4,5;1
2016.02.22 16:54:47.853;1,10242;1,10241;1;1
2016.02.22 16:54:48.285;1,1024;1,10238;1;2,32
Задача - усреднить в течение одной минуты значения левого столбца лишь, то есть
1,10242
1,10242
1,10242
1,10243 и т. д.
Код, выполняющий эту операцию:
from datetime import datetime
# считали пары ключ-первое значение
A = [line[:-1].split(';')[:2] for line in open('log.txt').readlines()]
# преобразовали ключи к типу datetime
B = [[datetime.strptime(key[:16], '%Y.%m.%d %H:%M'), value] for key, value in A]
# сформировали множество уникальных ключей
C = sorted(set(d for d, v in B))
# рассчитали среднее по каждому ключу
D = [[key, sum(float(b[1].replace(',','.')) for b in B if b[0]==key) / sum(1.0 for b in B if b[0]==key)] for key in C]
# записали результат в файл
outFile = open("ask.txt", "w")
outFile.write('\n'.join(str(round(value,5)) for key, value in D))
outFile.close()
Собссно, вопрос: в этом текстовом файле примерно 630 000 строк. Операция в пайтоне - суммировать значения левого столбца в течение одной минуты, затем делить на число строк, попавших в минуту - ну простое усреднение.
ВРЕМЕНИ на это уходит уйму! Точно не засекал, но в случае 630к строк около 3-4 часов, не подскажите, это так разве и должно быть или код такой или что-то еще?)
Не читай весь файл сразу, там очень много записей, отсюда и тормоза. Записи в самом файле упорядочены? Делай примерно так (очень грубо):
sum = 0.0 #сумма
count = 0 #количество
old_time = '' #время
out = open("w") #открываем файл результатов
for line in open('log.txt').readlines():
__parts = line.split(' ', 2) #выделяем время
__if parts[0]!=old_time:
____out.write(str(avg/count))
____old_time=parts[0]
____sum=0.0
____count=0
__else:
____parts = parts[1].split(';',3)
____count+=1
____avg+=float(parts[2])
out.close()