@William03

Как сократить время выполнения данной программы (Python)?

Есть одна неинтересная задача, которую мне вроде как удалось решить (условия снизу, код в конце).

Складывай и умножай.
Ограничение времени 2 секунды
Ограничение памяти 64Mb
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Вам даны два массива одинаковой длины A и B.
Вы должны выполнять 3 типа запросов:
“* l r x”: прибавить целое число x ко всем Ai, где l≤i≤r.
“. l r x”: прибавить целое число x ко всем Bi, где l≤i≤r.
“? l r”: вычислить сумму Al⋅Bl + … + Ar⋅Br.
Массивы пронумерованы, начиная с единицы. Изначально оба массива заполнены нулями.
Формат ввода
Первая строка входа содержит два целых числа n и m, разделённых пробелами — длина массивов и количество запросов, соответственно (1≤n,m≤100000).
Последующие m содержат запросы в формате, описанном в условии. Для каждого запроса 1≤l≤r≤n и 1≤x<10**9+7.
Формат вывода
Для каждого запроса третьего типа выведите остаток от деления соответствующей суммы на 10**9 + 7.
Пример
Ввод:
5 4
* 1 4 10
. 2 5 8
? 1 3
? 2 5
Вывод:
160
240
Все вроде и ничего, но на одном из тестой выдает TL. Время работы - 2,081 с. вместо 2-х с..
Хотелось бы переделать программку так, чтобы этой ошибки не было. Код моего решения:
# Functions
def func_1(l,r,x,S):
	for i in range(l-1,r):
		S[i] += x
	return S
def func_2(l,r,A,B):
	s = 0
	for i in range(l-1,r):
		s += A[i] * B[i]
	return s % (10**9 + 7)
# End of functions
In_0 = list(map(int,input().split()))
L = In_0[0]
N = In_0[1]
A = [0] * L
B = [0] * L
for i in range(N):
	In = list(input().split())
	if In[0] == '*':
		A = func_1(int(In[1]),int(In[2]),int(In[3]),A)
	elif In[0] == '.':
		B = func_1(int(In[1]),int(In[2]),int(In[3]),B)
	elif In[0] == '?':
		print(func_2(int(In[1]),int(In[2]),A,B))
  • Вопрос задан
  • 741 просмотр
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 2
15432
@15432
Системный программист ^_^
Не нужно переприсваивать A и B каждый раз, просто подать в функцию и там изменить.
Ответ написан
@lega
* Если python версии 2.X то замените все range на xrange.
* "return S" в func_1 не имеет смысла, т.к. ссылка на лист не меняется.
* можете попробовать numpy, мозможно там есть готовые ф-ии для этого, будет работать в разы быстрее или выбрать pypy если есть возможность.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы