Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как уменьшить выделение памяти данной программы и ускорить её? / 6 сообщений из 6, страница 1 из 1
10.09.2018, 03:21
    #39700197
Aleksei2213
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как уменьшить выделение памяти данной программы и ускорить её?
программа принимает списки подставляет их под формулы и сортирует.
2# сколько списков
2 9 9 9 # первое число в этом списке кол элементов нём -1
2 8 8 8


Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
import math 
log_2 = math.log(2) #сюда вывел логорифм для оптимизации
h = {}
i = 0
acc = 0
for _ in range(int(input())): # считываем кол списков
    s = input()[2:]
    s = s.split()
    if '1' in s: # удаляю единицы из списка такие списки 9 1 9 9  становятся такими 9 1
        s = s[:s.index('1') + 1]
    if len(s) == 1: # если длина его 1
        acc = -9
        del s[-1]
    elif len(s) == 2: # если длина его 2
        acc = math.log(float(s[-1])) 
        del s[-1]
        acc += math.log(math.log(float(s[-1])) / log_2) 
        del s[-1]
    else:
        acc = float(s[-1])
        del s[-1]
        acc *= math.log(float(s[-1])) 
        del s[-1]
        acc += math.log(math.log(float(s[-1])) / log_2) / log_2
        del s[-1]
        while len(s) != 0 and acc < 500:  # если он слишком большой
            acc = (2 ** acc) + (math.log(float(s[-1])) / log_2) / log_2
            del s[-1]
 
    h[i] = [int(item) for item in s]
    s.clear()
    acc = round(acc, 10) # округляю последние число
    h[i].append(acc)
    h[i].reverse()
    # print(h[i])
    i += 1
 
sorted_list = sorted(h.items(), key=lambda x: (len(x[1]), x[1])) # сортирую списки
print(' '.join(str(i + 1) for i, _ in sorted_list))
...
Рейтинг: 0 / 0
10.09.2018, 10:32
    #39700281
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как уменьшить выделение памяти данной программы и ускорить её?
Как уменьшить выделение памяти данной программы и ускорить её?


Для начала, я бы посоветовал определить, какая же конкретно часть программы занимает больше всего времени. Хотя бы так
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
total_t1 = 0

.....
t = time.time()
acc = math.log(float(s[-1])) 
del s[-1]
acc += math.log(math.log(float(s[-1])) / log_2) 
del s[-1]
total_t1 += time.time() - t
......


без этого простого эксперимента трудно понять, где именно затуп, он может быть очень много где в вашем коде. Например, вас не смущает, что вы дважды подряд ищете в списке единицу?
Код: python
1.
2.
3.
    
if '1' in s: # тут итерация по списку (в пессимистичном варианте по всему)
      s = s[:s.index('1') + 1] # тут еще одна итерация по списку


Или, вот зачем вы делаете s.clear()?
Почему вы думаете, что del s[-1] - бесплатная операция? Удаление из списка дает такую же сложность, как добавление в него.

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
l = range(1000)


def test_append():
    for i in range(1000):
        l.append(i)

def test_del():
    for _ in range(len(l)):
        del l[-1]


if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test_append()", setup="from __main__ import test_append", number=10000))
    print(timeit.timeit("test_del()", setup="from __main__ import test_del", number=10000))



Много памяти расходуется? Ну а на кой черт вы копируете список в словарь? Чем вас не устраивало присваивание указателя? Зачем создаете новый список функцией sorted вместо использования одноименного метода? Зачем вам тут вообще нужен словарь, какое свойство словаря вы используете?
...
Рейтинг: 0 / 0
10.09.2018, 19:43
    #39700631
Aleksei2213
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как уменьшить выделение памяти данной программы и ускорить её?
использую словарь так как мне нужно потом их сортировать а списки я не могу так сортировать,del[-1] может можно её как то оптимизировать?
...
Рейтинг: 0 / 0
10.09.2018, 20:26
    #39700649
Aleksei2213
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как уменьшить выделение памяти данной программы и ускорить её?
не устраивало присваивание указателя?

а как это сделать?
...
Рейтинг: 0 / 0
11.09.2018, 08:45
    #39700729
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как уменьшить выделение памяти данной программы и ускорить её?
Aleksei2213использую словарь так как мне нужно потом их сортировать а списки я не могу так сортировать,del[-1] может можно её как то оптимизировать?

Вы понимаете головой, что когда вы делаете h.items() вы получаете список и сортируете вообще-то его, а не словарь, который сортировать в общем случае бессмысленно?
...
Рейтинг: 0 / 0
11.09.2018, 08:45
    #39700730
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как уменьшить выделение памяти данной программы и ускорить её?
Aleksei2213del[-1] может можно её как то оптимизировать

Зачем это вообще делать?
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как уменьшить выделение памяти данной программы и ускорить её? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]