С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 13.10.2022
Сообщений: 44

Можно как-то ускорить код?

17.11.2022, 15:07. Показов 2113. Ответов 21

Студворк — интернет-сервис помощи студентам
Python
1
2
3
4
5
6
7
8
9
10
11
12
a =input().split()
d = []
f = 0
d=input().split()
for w in range(int(a[1])):
    z=input().split()
    k=int(z[0])
    while k<=int(z[1]):
        f+=int(d[k-1])
        k+=1
    print(f)
    f=0
Условие:

размер массива, количество запросов

массив

(

в каких отрезках нужно найти сумму

)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.11.2022, 15:07
Ответы с готовыми решениями:

Можно ли ускорить код через pypy?
Многие видели видео в котором хауди с помощью интерпретатора pypy перевёл версию 2.7 в exe. А как правильно пользоваться интерпретатором...

Как можно попробовать ускорить код
Всем привет, написал решение для задачи с leetcode, но оно оказалось слишком медленным. Но я не могу понять, как можно ускорить мой код,...

Как можно оптимизировать/ускорить код?
Здравствуйте, задача примерно такого типа: на экселевском листе есть данные в 3 колоннах (обозначим a,b,c), для каждой ячейки a...

21
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
17.11.2022, 16:25
Цитата Сообщение от Itbkydc Посмотреть сообщение
Можно как-то ускорить код?
можно! условие задачи какое?
2
0 / 0 / 0
Регистрация: 13.10.2022
Сообщений: 44
17.11.2022, 19:51  [ТС]
Входные данные

В первой строке записано два целых числа n и q (1<=n, q<=3*10^5 ) - размер массива и количество запросов.

Во второй строке записаны n целых чисел v (1<=v<=10^9 ) - сам массив.

Далее в q строках описаны запросы к массиву. Каждый запрос описывается двумя числами l, r (1 <= l <= r <= n) - левой и правой границей отрезка, на котором нужно найти сумму.

Выходные данные

Для каждого запроса в отдельной строке выведите единственное число - сумму на соответствующем отрезке.


С 24 из 46 тесте превышен лимит по времени, что там дальше по числам - не знаю(

Надо пробовать переписать на с++, но я с ними не особо дружу, поэтому хочу найти способ ускорить питон, если это возможно
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
17.11.2022, 20:04
через префикс-суммы это решается. на python'е должно пройти, ограничения не такие уж большие.
2
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.11.2022, 20:46
Цитата Сообщение от Itbkydc Посмотреть сообщение
Надо пробовать переписать на с++
Вы думаете у проверяющей программы одинаковые временные ограничения для всех языков? Как для одного из самых медленных скриптовых языков (Python), так и для компилируемого, максимально оптимизированного С++?
Python
1
2
3
4
5
6
7
n, q = map(int, input().split())
data = list(map(int, input().split()))
result = []
for _ in range(q):
    left, right = map(int, input().split())
    result.append(sum(data[left - 1:right]))
print(*result, sep='\n')
Code
1
2
3
4
5
6
7
8
9
10
5 2
1 2 3 4 5
2 3
1 5
5
15
 
 
** Process exited - Return Code: 0 **
Press Enter to exit terminal
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
17.11.2022, 20:54
Python
1
2
3
4
5
6
7
8
9
from itertools import accumulate
from random import sample
 
n, q = 300000, 300000
a =[1]*n
cum = [x for x in accumulate([0]+a)]
for _ in range(q):
    left, right = tuple(sorted(sample(range(1,n),2)))
    print(cum[right]-cum[left-1])
Добавлено через 2 минуты
anton78spb, ваш код не пройдет по времени
1
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.11.2022, 21:00
Red white socks, А так?
Python
1
2
3
n, q = map(int, input().split())
data = list(map(int, input().split()))
[print(sum(data[a - 1:b])) for a, b in [map(int, input().split()) for _ in range(q)]]
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
17.11.2022, 21:05
anton78spb, у вас сложность O(q*n)
Посмотрите у меня через кумуляты, тут О(max(q,n))

Добавлено через 2 минуты
Цитата Сообщение от eaa Посмотреть сообщение
через префикс-суммы это решается
Посмотрел на вики. В первый раз слышу такое обозначение)) Всегда кумулятивной или частичной суммой такое называл.
Для тех, кто немного интересовался тервером и знает, что такое функция и плотность распределения - задача не вызовет никакой трудности
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
17.11.2022, 21:16
Red white socks, одно и тоже.
У accumulate есть параметр initial=0
2
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
17.11.2022, 21:20
Цитата Сообщение от eaa Посмотреть сообщение
У accumulate есть параметр initial=0
Спасибо, я знал про accumulate, но раньше как-то не доводилось его применять
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
17.11.2022, 21:24
Red white socks, почти всегда подобные задачи решаю через нее.
1
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.11.2022, 21:37
Red white socks, Посмотрел документацию на itertools.accumulate. Возможно я сильно туплю под вечер, но я вообще не понимаю, как можно применить эту функцию при решении данной задачи. Что вы тут собираетесь аккумулировать?

Просто на примере. Пусть будут такие данные.
n, q = 5, 2
nums = 6, 3, 1, 8, 4.
Две пары границ
с 2 по 4
с 1 по 3

Результат для пары (2, 4): 3 + 1 + 8 = 12
Результат для пары (1, 3): 6 + 3 + 1 = 10

Можете пояснить, что тут надо аккумулировать? Или возможно я не понял условия задачи.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
17.11.2022, 21:45
тут более понятнее
2
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
17.11.2022, 22:03
anton78spb, пусть S(n) = sum(a[1:n+1]) - сумма чисел массива от первого до n-го
Тогда сумма чисел от i-го до j-го s(i,j)=S(j)-S(i-1)
Результат каждого запроса находится за 1 вычитание, вне зависимости сколько чисел нужно сложить в запросе.

Добавлено через 14 минут
По примеру:
Считаем кумуляты (префикс-суммы):
S(0) =0
S(1) = 6
S(2) = 6+3
S(3) = 6+3+1 = 10
S(4) = 6+3+1+8= 18
S(5) = 6+3+1+8+4= 22

Тогда
s(2,4) = S(4) - S(1) = 18 - 6 = 12
s(1,3) = S(3) - S(0) = 10 - 0 = 10
Итого потребуется n операций для расчета кумулят + q операций на запросы. Итого n+q вместо n*q
5
0 / 0 / 0
Регистрация: 13.10.2022
Сообщений: 44
18.11.2022, 09:22  [ТС]
Спасибо


Да, там, где я решаю сейчас задачи, ограничение по аремени не перерасчитывается в зависимости от языка
0
 Аватар для rim41
1045 / 313 / 78
Регистрация: 16.03.2020
Сообщений: 954
18.11.2022, 09:25
Цитата Сообщение от Itbkydc Посмотреть сообщение
не перерасчитывается в зависимости от языка
Забавно, но не лучшим образом говорит о платформе
0
0 / 0 / 0
Регистрация: 13.10.2022
Сообщений: 44
19.11.2022, 13:06  [ТС]
код стал быстрее, теперь лимит превышен только с 36 теста
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
19.11.2022, 13:54
Itbkydc, Вроде многоуважаемые eaa и Red white socks уже очень детально расписали как данная задача решается.
Python
1
2
3
4
5
from itertools import accumulate
 
n, q = map(int, input().split())
acc = [0, *accumulate(map(int, input().split()))]
[print(acc[b] - acc[a - 1]) for a, b in [map(int, input().split()) for _ in range(q)]]
Code
1
2
3
4
5
6
7
8
9
10
5 2
1 2 3 4 5
2 3
1 5
5
15
 
 
** Process exited - Return Code: 0 **
Press Enter to exit terminal
0
0 / 0 / 0
Регистрация: 13.10.2022
Сообщений: 44
19.11.2022, 17:38  [ТС]
Я выше поблагодарил этих многоуважаемых, но так же уточнил, что несмотря на то, что код стал быстрее, на части тестов он все так же, ни с одной из предложенных программ, не проходит по времени.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
19.11.2022, 17:47
Тут вспоминается один представитель малокоренного народа, которому все буквы дали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2022, 17:47
Помогаю со студенческими работами здесь

Как можно ускорить мой код?
first = input() n, m, k = map(int, first.split()) text = &quot;&quot; for qqq in range(n): ch = input() text += ch + &quot; &quot; raw = ...

Как можно ускорить этот код?
Решил поиграться с искривлением экрана, но происходит это как-то медленно, хотелось бы, чтобы работало быстрее. Код вот:#include...

Как можно ускорить код? Решение выдаёт верное, но по времени не проходит
Как можно ускорить код? Решение выдаёт верное, но по времени не проходит ограничение по времени на тест 2 секунды ограничение по...

Можно ли ускорить код?
__kernel void LJ_Verlet_Kernel ( __global float * x , __global float *...

Как можно ускорить BWT?
Продолжается работа над компрессором файлов. Достиг того, что при &quot;гигантском&quot; времени сжатия Властелина Колец он уже опережает ZIP и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru