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

Как сократить алгоритм , что бы ускорить время выполнения

14.01.2016, 13:45. Показов 4713. Ответов 23

Студворк — интернет-сервис помощи студентам
Всем Доброго времени суток

Подскажите пожалуйста как можно преобразовать код , либо сократить его для быстродействия?

Исходный код :
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
import time
 
num0 = 0
num1 = 0 
num2 = 0
num3 = 0
num4 = 0
num5 = 0
num_end = 62
num = [num0 , num1 , num2 , num3 , num4 , num5]
 
t = time.asctime()
print (t)
while True:
    print (num)
    num5 += 1
    num = [num0 , num1 , num2 , num3 , num4 , num5]
    password = ""
    if num5 == num_end:
        num5 = 0
        num4 += 1
        if num4 == num_end:
            num3 += 1
            num4 = 0
            if num3 == num_end:
                num2+= 1
                num3 = 0
                if num2 == num_end:
                    num1 += 1
                    num2 = 0
                    if num1 == num_end:
                        num0 += 1
                        num1 = 0
                        if num0 == num_end:
                            print("End")
                            t = time.asctime()
                            print (t)
                            break
  • Возможно есть какие то методы или процедуры?
  • Так же хотелось бы узнать как можно по другому подсчитать время выполнения?
Желательно с подробным пояснением

# Начал изучать язык относительно недавно
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2016, 13:45
Ответы с готовыми решениями:

Как сократить время выполнения
def test(word1, word2): return sorted(word1) == sorted(word2) n = int(input()) words = for i in range(n): word =...

Как сократить время выполнения программы?
#include <iostream> #include <string> using namespace std; int main(){ string S; string T; string A; cin >> S; int...

A^b mod m. Как сократить время выполнения ?
Здравствуйте! Рабочий код (вроде), но при проверке разные ошибки типа превышения времени ожидания и тп. Помогите разобраться в чем...

23
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.01.2016, 13:54
Цитата Сообщение от AvisMortes Посмотреть сообщение
Так же хотелось бы узнать как можно по другому подсчитать время выполнения?
Модуль timeit, функция timeit.
Цитата Сообщение от AvisMortes Посмотреть сообщение
Подскажите пожалуйста как можно преобразовать код
Для начала давай выясним, что за мракобесие тут творится?
0
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 15
14.01.2016, 14:13  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Модуль timeit, функция timeit.

Для начала давай выясним, что за мракобесие тут творится?
Ну у нас есть список который содержит в себе числа num0,num1,num2,num3,num4,num5.

Каждый раз когда крайний правый элемент списка достигает определенного числа следующий левый элемент списка (например : num4) увеличивается на один.

Так же работает и для других элементов(например: если num3 будет равен 62 , то num2 увеличится на 1, а num 3 станет равным 0.

Итог работы программы : список содержащий значение [62,62,62,62,62,62]
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
14.01.2016, 14:37
Тогда, я думаю, лучше сделать так:
Python
1
2
3
4
5
6
7
for num0 in xrange(63):
    for num1 in xrange(63):
        for num2 in xrange(63):
            for num3 in xrange(63):
                for num4 in xrange(63):
                    for num5 in xrange(63):
                        ...
1
68 / 66 / 19
Регистрация: 27.12.2008
Сообщений: 212
14.01.2016, 14:51
Лучший ответ Сообщение было отмечено AvisMortes как решение

Решение

еще быстрее будет если
  • заранее составить список возможных значений
  • не создавать каждый раз num,
  • менять по одному элементу
как-то так

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
num = [0, 0, 0, 0, 0]
num_end = 15
values = [x for x in range(num_end)]
 
for num0 in values:
    num[0] = num0
    for num1 in values:
        num[1] = num1
        for num2 in values:
            num[2] = num2
            for num3 in values:
                num[3] = num3
                for num4 in values:
                    num[4] = num4
                    # print(num)
1
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
14.01.2016, 15:54
Цитата Сообщение от alex925 Посмотреть сообщение
что за мракобесие тут творится?
+1 Ну на пуркуа?
Python
1
result = [num_end for _ in range(6)]
1
68 / 66 / 19
Регистрация: 27.12.2008
Сообщений: 212
14.01.2016, 16:04
Много вы понимаете. В коде же явно указано password (18 строка). Судя по недавним новостям, готовится серьезная операция. Надеюсь 62^5 не станет проблемой для железа AvisMortes, а славой поделиться с помогавшими. Правда если эта страница всплывет... Кстати, Marinero, реализация частичных случаев тоже вменяется как соучастие
1
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 15
14.01.2016, 16:21  [ТС]
ну это просто была часть код , проверка алгоритма и время выполнения . Ничего страшного за этим не стоит)

Добавлено через 7 минут
Цитата Сообщение от dondublon Посмотреть сообщение
Тогда, я думаю, лучше сделать так:
Python
1
2
3
4
5
6
7
for num0 in xrange(63):
    for num1 in xrange(63):
        for num2 in xrange(63):
            for num3 in xrange(63):
                for num4 in xrange(63):
                    for num5 in xrange(63):
                        ...
А для чего служит xrange?
И как можно проверить работу циклов(например: выводом сообщений об изменениях)?
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
14.01.2016, 16:22
Xero201,
Python
1
2
from itertools import product
print(*(''.join(map(str, i)) for i in product(range(63), repeat=6)), sep='\n')
2
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 15
14.01.2016, 16:29  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
+1 Ну на пуркуа?
Python
1
result = [num_end for _ in range(6)]
Это создание списка?
Python
1
for _ in range(6)
Для чего перед циклом for стоит num_end ? Как он влияет на цикл?

И еще вопрос:
В вашем случае не будет создан список result внутри которого будешь еще один список?
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
14.01.2016, 16:36
Цитата Сообщение от AvisMortes Посмотреть сообщение
Это создание списка?
Да, из 6-ти повторяющихся num_end
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.01.2016, 16:36
Цитата Сообщение от AvisMortes Посмотреть сообщение
Для чего перед циклом for стоит num_end ? Как он влияет на цикл?
И еще вопрос:
В вашем случае не будет создан список result внутри которого будешь еще один список?
List comprehensions
1
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 15
14.01.2016, 16:49  [ТС]
По Способу работы мой алгоритм должен напоминать что то похожее на часы , либо как купюры денег .


т.е. если в моем списке всего 3 числа num0 num1 num2, то num0 - это копейки(предел их 99 , при набирание 100 копеек переходит в рубль num1, так же и с num1 предел 99 рублей , если в num1 набирается 100 , тогда переходит в num2 (сто рублевые купюры))

В общем я не знаю как еще можно объяснить, я плохо объясняю.


Просто из предложенных алгоритмов не все подходят , но я благодарен за поддержку и помощь.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
14.01.2016, 16:56
AvisMortes, Cовет: Стоит начинать не с вопроса "Как реализовать очередной кривой алгоритм", а с поставленной задачи, а потом уже приводить свои наработки.

Не по теме:

Хм, надо предложить чтоб этот текст в Правила добавили…

1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.01.2016, 18:21
Лучший ответ Сообщение было отмечено AvisMortes как решение

Решение

Цитата Сообщение от AvisMortes Посмотреть сообщение
По Способу работы мой алгоритм должен напоминать что то похожее на часы , либо как купюры денег .
Это хорошая аналогия, т.к. подсказывает решение.

Не нужно вручную выполнять переносы между разрядами — получаются лесенки из первого поста, либо еще какая-нибудь лапша.

Достаточно выбрать минимальные единицы измерения, и хранить значение в них. По необходимости — раскладывать на составляющие. Время — в секундах, деньги — в копейках. Для демонстрации пусть будет пример с купюрами, а минимальной единицей считаем рубль. Код размещаю под спойлером, чтобы автор хотя бы попытался подумать сам прежде чем смотреть.

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def main():
    upper_bound = 1001
    dividers = [1000, 500, 100, 50, 10, 1]
 
    for x in range(upper_bound):
        print(decompose(x, dividers))
 
 
def decompose(x, dividers):
    result = []
 
    for divider in dividers:
        result.append(x / divider)
        x %= divider
 
    return result
 
 
if __name__ == '__main__':
    main()
1
51 / 51 / 18
Регистрация: 03.12.2015
Сообщений: 167
14.01.2016, 19:39
Python
1
2
3
4
5
6
7
8
9
10
nums = [0, 0, 0, 0, 0, 0]
n = len(nums) - 1
while True:
    print(nums)
    nums[n] += 1
    if nums[n] == 62:
        if n == 0:
            print(nums)
            break
        n -= 1
Добавлено через 1 минуту
если я понял все правильно, то делается очень просто, без всяких вложенных проверок и прочего оверхеда. Попробуйте запустить. Я бы вставил вывод, но он очень большой

Добавлено через 3 минуты
а не, я понял неправильно

Добавлено через 26 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nums = [0, 0, 0, 0, 0, 0]
n = len(nums) - 1
k = 0
print(nums)
while True:
    nums[n] += 1
    if nums[n] == 62:
        print(nums)
        if k < n:
            nums[n] = 0
            n -= 1
        else:
            n = len(nums) - 1
            k += 1
        continue
    if k == len(nums):
        nums[n] -= 1
        break
    print(nums)
Добавлено через 16 секунд
вот так правильно

Добавлено через 2 минуты
окончательный вариант такой (хотя предыдущий тоже работает):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nums = [0, 0, 0, 0, 0, 0]
n = len(nums) - 1
k = 0
print(nums)
while True:
    nums[n] += 1
    print(nums)
    if nums[n] == 62:
        if k < n:
            nums[n] = 0
            n -= 1
        else:
            n = len(nums) - 1
            k += 1
    if k == len(nums):
        break
Добавлено через 3 минуты
можно сколько угодно чисел ставить, будет работать правильно
1
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
14.01.2016, 20:11
Прямо буквально дурацкому алгоритму
Python
1
2
3
4
5
6
while not all(x == 62 for x in n):
    for i in range(1, len(n)):
        if n[i] == 63:
            n[i]=0
            n[i-1] += 1
    n[-1] += 1
0
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 15
14.01.2016, 22:26  [ТС]
Часы работают по такому же принципу , почему же он дурацкий ?
Цитата Сообщение от Marinero Посмотреть сообщение
дурацкому алгоритму
Просто хотел реализовать метод комбинаторики, а точнее сколько чисел возможно получить из перестановки шести элементов списка принимающие значения от 0 до 62.

В принципе я решил свою проблему.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
14.01.2016, 22:54
Немного быстрее
Python
1
2
3
4
5
6
7
8
9
10
while not all(x == 62 for x in n):
    i = len(n)
    while i:
        try:
            i = n.index(63, i - 1, i)
            n[i] = 0
            n[i-1] += 1
        except ValueError:
            i = 0
    n[-1] += 1
Цитата Сообщение от AvisMortes Посмотреть сообщение
почему же он дурацкий ?
Потому что прибавлять по 1 — абсолютно не рентабельно. А
Цитата Сообщение от AvisMortes Посмотреть сообщение
Часы работают по
принципу показанному 0x10
1
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 15
14.01.2016, 22:58  [ТС]
Я понимаю что прибавлять по одному это не круто , но я же в начале писал.
Цитата Сообщение от AvisMortes Посмотреть сообщение
# Начал изучать язык относительно недавно
В этом то вся и проблема.
Не зря же я обращаюсь за советами к тем кто лучше меня разбирается в этом.
Узнаю для себя различные подходы новые.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2016, 22:58
Помогаю со студенческими работами здесь

Как сократить время выполнения кода:
main = input() main = main.split() gg = set() for i in range(int(main)): days = input() days = days.split() pp = ...

Как можно сократить время выполнения кода?
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main(){ string S; string T; string A; cin &gt;&gt; S; int...

Как ускорить время выполнения запроса
Здравствуйте, как можно ускорить данный запрос: SELECT id, surname, CASE WHEN ball &lt; 60 THEN 'Низкий' WHEN ball BETWEEN...

Как ускорить время выполнения программы
Добрый день :) Исходные данные В единственной строке находится целое число N, 1 ≤ N ≤ 10^9. Результат Следует...

Как ускорить время выполнения и уменьшить вес программы?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru