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

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

17.11.2022, 15:07. Показов 2154. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru