Можно ли ускорить данный Python код?
def is_sorted(sequence) -> bool:
it = iter(sequence)
try:
lhs = next(it)
except StopIteration:
raise ValueError('Empty sequence')
for rhs in it:
if lhs <= rhs:
lhs = rhs
else:
return False
return True
arr = []
s = []
a, q = map(int, input().split())
for i in range(a, q + 1):
c = []
k = str(i)
for h in range(0, len(str(i))):
d = k[h]
c.append(d)
s.append(c)
for j in range(0, len(s)):
f = []
for v in range(0, len(s[j])):
g = s[j]
g1 = g[v]
gi = int(g1)
f.append(gi)
arr.append(f)
ls = list(filter(is_sorted, arr))
print(len(ls))
Код работает слишком долго. Можно ли его ускорить? Если да то как? Без использования сторонних модулей
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
Для начала уберем явный мусор:
def is_sorted(sequence) -> bool:
it = iter(sequence)
try:
lhs = next(it)
except StopIteration:
raise ValueError('Empty sequence')
for rhs in it:
if lhs <= rhs:
lhs = rhs
else:
return False
return True
a, q = map(int, input().split())
s = [list(str(i)) for i in range(a, q + 1)]
arr = [[int(digit) for digit in obj] for obj in s]
ls = list(filter(is_sorted, arr))
print(len(ls))
Понятно, что программа считает кол-во чисел о a до q у которых цифры идут по возрастанию
Вот такой код будет оптимальнее:
a, q = map(int, input().split())
count = 0
for num in range(a, q + 1):
if str(num) == ''.join(sorted(str(num))):
count += 1
print(count)
А такой код - короче:
a, q = map(int, input().split())
print(len([num for num in range(a, q + 1) if str(num) == ''.join(sorted(str(num)))]))
или такой:
print(len([num for num in range(a, q + 1) if num == int(''.join(sorted(str(num))))]))
А вот это практически самый быстрый код поскольку без лишних преобразований
count = 0
for num in range(a, q + 1):
is_sorted = True
old_digit = 10
while num != 0:
if num % 10 > old_digit:
is_sorted = False
break
old_digit = num % 10
num //= 10
count += is_sorted
print(count)