Sergey_418
@Sergey_418
Инженер-конструктор, учу python

При использовании range( ), через N-ное количество циклов падает скорость?

При использовании range( ), через N-ное количество циклов падает скорость. В интернете как такового решения не нашел (ну или было не доступным языком написано, что я просто не понял) Ниже прикрепляю код.

from graphics import *


win = GraphWin("Окно для графики", 310, 350)
win.setBackground('white')

def down():
        for i in range(250):
            print (i)
            obj = Circle(Point(150, 20), 15)
            
            obj.move(0, i)
            obj.setFill("yellow")
            obj.setWidth(1)
            obj.draw(win)
            
            
def up():   
            
        for i in reversed(range(250)):
                print (i)

                obj = Circle(Point(150, 20), 15)

                obj.move(0, i)
                obj.setWidth(1)
                obj.setFill("red")
                obj.draw(win)


while True:
        down()
        up()
                
win.getMouse()
win.close()
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
@o5a
Потому что в целом подход неправильный. Вы каждый цикл создаете новый объект и просто его отрисовываете поверх других, сдвигая каждый раз на новую величину.
Вместо этого нужно 1 раз создать свой Circle и его уже потом двигать (и двигать соответственно не на i, а на одинаковое фиксированное значение (если ожидается равномерное движение).
И наверное в цикл стоит добавить задержку в виде time.sleep(0.01)
obj = Circle(Point(150, 20), 15)
obj.setWidth(1)
obj.draw(win)

def down():
    for i in range(250):
        print (i)

        obj.setFill("yellow")
        obj.move(0, 1)
        time.sleep(0.01)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Vindicar
reversed(range(250))
Зачем? Чем не устроил range(249, -1, -1)?

Далее, ты и в up() и в down() в цикле создаёшь раз за разом один и тот же объект, а потом забываешь про него. Зачем устраивать разминку для сборщика мусора? Создай объект 1 раз и модифицируй его - либо в глобальной переменной, либо (лучше) в классе.
Ответ написан
Комментировать
savickii2002
@savickii2002
Новичок, люблю python
Принты заметно замедляют программу, попробуйте без них ;) И действительно, некоторые переменные вы можете не пересоздавать, я не про генератор. Вы можете в цикле создать ваш объект Circle, и передавать его в функции up и down и изменять его, а не каждый раз создавать - затратная однако операция.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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