Форум сайта python.su
0
Всем доброго времени суток
Написал программку, но меня не устраивает время выполнения, хотелось бы побыстрее.
Полагаю есть несколько способов как ускорить:
- Запускать в какой-то среде разработки или в консоли(я запускал в текстовом редакторе Sublime)
- Подключить какую-то библиотеку, чтоб распаралелить выполнение(в процессе выполнения, у меня, было задействовано одно ядро, процессор грузился в среднем на 17-18 %)
- Улучшить код программы
- Возможно что-то еще, о чем даже не знаю что такое может быть)
import os import pandas as pd #digit from str def extract_deg(input_str): if input_str is None or input_str == '': return 0 out_number = '' f = 0 for ele in input_str: if ele.isdigit() or ele == '-': out_number += ele elif ele == ',': out_number += '.' f = 1 if f == 1: out_number = (float(out_number)) else: out_number = (int(out_number)) return (out_number) frame = pd.DataFrame() af = os.listdir(path=".") nf = af[10:-5] for i in nf: frame = frame.append(pd.read_csv(i), ignore_index=True) frame.to_csv("datatest.csv", encoding='utf-8', sep='\t', index=False) frame['minmax'] = frame['MAX'] - frame['MIN'] #массивы переменных dlst = ['dvar1', 'dvar2', ..., 'dvar11'] slst = ['svar1', 'svar2', ..., 'svar20'] elst = ['evar1', 'evar2', ..., 'evar44'] blst = ['year', 'mounth', 'day', 'hh', 'mm'] sls = [] for i in slst: exec(i + ' = []') exec('sls.append('+i+')') els = [] for i in elst: exec(i + ' = []') exec('els.append('+i+')') bls = [] for i in blst: exec(i + ' = []') exec('bls.append('+i+')') print(len(frame)) for i in range(len(frame)): year.append(int(str(frame['DATE'][i])[:4])) mounth.append(int(str(frame['DATE'][i])[4:6])) day.append(int(str(frame['DATE'][i])[6:8])) hh.append(int(str(frame['TIME'][i])[:2])) mm.append(int(str(frame['TIME'][i])[2:4])) time = [year[i], mounth[i], day[i], hh[i], mm[i], 0] print(i, end=' ') #def1, def2 собирают текстовые данные, из которых, #при помощи extract_deg вытаскиваются числовые значения for p in range(len(dlst)-1): l = (def1(dlst[p], time)) sls[p*2].append(l[0]) sls[(p*2)+1].append(l[1]) for p in range(len(dlst)): l = (def2(dlst[p], time)) els[p*4].append(l[0]) els[(p*4)+1].append(l[1]) els[(p*4)+2].append(l[2]) els[(p*4)+3].append(l[3]) alllst = sls + els + bls salllst = slst + elst + blst for i in range(len(alllst)): frame[salllst[i]] = pd.Series(alllst[i]) frame.to_csv("data.csv", encoding='utf-8', sep='\t', index=False)
Офлайн
568
yalumeaЧто это, Куча? Что это?
for i in slst:
exec(i + ' = ')
exec('sls.append('+i+')')
Офлайн
253
yalumeaЭто практически не влияет на скорость.
- Запускать в какой-то среде разработки или в консоли(я запускал в текстовом редакторе Sublime)
yalumeaПеред этим надо выяснить что тормозит программу. Выяснить это по приведенным вами данным нельзя, поскольку вы не привели входных данных.
- Подключить какую-то библиотеку, чтоб распаралелить выполнение(в процессе выполнения, у меня, было задействовано одно ядро, процессор грузился в среднем на 17-18 %)
yalumeaЧто это?
- Улучшить код программы
yalumeaОсновной способ вы не назвали - оптимизация алгоритма. Да для питона важно выносить вычислительно сложные части во внешние модули расширения (которые компилируются и оптимизированы).
- Возможно что-то еще, о чем даже не знаю что такое может быть)
yalumeaКакое это время? Сколько у вас данных, какая скорость вам нужна? Может ваши желания несбыточны и возиться нет смысла.
но меня не устраивает время выполнения, хотелось бы побыстрее.
yalumeaТакие штуки очевидно неффективны
year.append(int(str(frame)))
yalumeaТут вам бы массивы использовать
exec('bls.append('+i+')')
yalumeaфункция не используется.
def extract_deg(input_str):
Офлайн
0
FishHookfor i in slst: exec(i + ' = []') # Объявление переменных из списка названий переменных exec('sls.append('+i+')') #Запись переменных в список, чтобы потом можно было обращаться к каждой переменной в цикле
Отредактировано FishHook (Янв. 7, 2020 00:25:18)
Офлайн
0
doza_andфункция используется по несколько раз в других функциях, т.к. они собирают данные в текстовом виде, и данная функция вызывается, чтобы вытащить числовые значения из текста
yalumea
def extract_deg(input_str):
функция не используется.
doza_andНе знаю как на Питоне использовать массивы, поэтому пользуюсь списками
yalumea
exec('bls.append('+i+')')
Тут вам бы массивы использовать
doza_andЯ бы рад сделать это без цикла как-то так:
Очевидно код содержит дичь
yalumea
year.append(int(str(frame)))
Такие штуки очевидно неффективны
frame['year'] = frame['<DATE>'][:4]
doza_andНа данный момент в датафрейме 2948265 строк, в каждую строку добавляется по 69 новых записей, все это выполняется за 2,5 дня
Какое это время? Сколько у вас данных, какая скорость вам нужна? Может ваши желания несбыточны и возиться нет смысла.
Отредактировано yalumea (Янв. 6, 2020 22:07:09)
Офлайн
253
У вас наверное неверное представление о том что такое питон. Это способ вызвать готовые высокоуровневые функции реализованные на С. А сами команды питоном не особо быстро выполняются.
yalumeaВ вашем фрагменте кода нет ее вызова.
функция используется по несколько раз в других функциях,
import datetime import time lit=["20170820"]*3000000 t0 = time.perf_counter() [datetime.datetime.strptime(i, '%Y%m%d') for i in lit] t1 = time.perf_counter() print(t1-t0) 31
Отредактировано doza_and (Янв. 7, 2020 00:32:31)
Офлайн
857
yalumeaЧтобы улучшить код программы, нужно сначала её полностью придумать без всякого кода. Потом её нужно продумать без всякого кода. И вот когда она уже вся придумана и продумана, можно будет её записывать в виде кода.
- Улучшить код программы
Офлайн
294
yalumeaЯ бы начал с профилирования чтобы выяснить узкие места в коде и уже смотреть можно ли их оптимизировать и если можно то как.
меня не устраивает время выполнения, хотелось бы побыстрее.
... for i in range(len(frame)): year.append(int(str(frame['DATE'][i])[:4])) mounth.append(int(str(frame['DATE'][i])[4:6])) day.append(int(str(frame['DATE'][i])[6:8])) ...
(str(frame['DATE'][i])
... for i in range(len(frame)): str_date = str(frame['DATE'][i]) year.append(int(str_date[:4])) mounth.append(int(str_date[4:6])) day.append(int(str_date[6:8])) ...
[code python][/code]
Отредактировано PEHDOM (Янв. 7, 2020 18:27:38)
Офлайн