How to speed up python's 'turtle' function and stop it freezing at the end

后端 未结 4 1811
后悔当初
后悔当初 2020-12-05 14:13

I have written a turtle program in python, but there are two problems.

  1. It goes way too slow for larger numbers, I was wonder how I can speed up turtle.
相关标签:
4条回答
  • 2020-12-05 14:30

    For reference, turtle being slow is an existing problem. Even with speed set to max, turtle can take quite a long time on things like fractals. Nick ODell reimplemented turtle for speed here: Hide Turtle Window?

    import math
    
    class UndrawnTurtle():
    def __init__(self):
        self.x, self.y, self.angle = 0.0, 0.0, 0.0
        self.pointsVisited = []
        self._visit()
    
    def position(self):
        return self.x, self.y
    
    def xcor(self):
        return self.x
    
    def ycor(self):
        return self.y
    
    def forward(self, distance):
        angle_radians = math.radians(self.angle)
    
        self.x += math.cos(angle_radians) * distance
        self.y += math.sin(angle_radians) * distance
    
        self._visit()
    
    def backward(self, distance):
        self.forward(-distance)
    
    def right(self, angle):
        self.angle -= angle
    
    def left(self, angle):
        self.angle += angle
    
    def setpos(self, x, y = None):
        """Can be passed either a tuple or two numbers."""
        if y == None:
            self.x = x[0]
            self.y = x[1]
        else:
            self.x = x
            self.y = y
        self._visit()
    
    def _visit(self):
        """Add point to the list of points gone to by the turtle."""
        self.pointsVisited.append(self.position())
    
    # Now for some aliases. Everything that's implemented in this class
    # should be aliased the same way as the actual api.
    fd = forward
    bk = backward
    back = backward
    rt = right
    lt = left
    setposition = setpos
    goto = setpos
    pos = position
    
    ut = UndrawnTurtle()
    
    0 讨论(0)
  • 2020-12-05 14:35

    Python turtle goes very slowly because screen refreshes are performed after every modification is made to a turtle.

    You can disable screen refreshing until all the work is done, then paint the screen, it will eliminate the millisecond delays as the screen furiously tries to update the screen from every turtle change.

    For example:

    import turtle
    import random
    import time
    screen = turtle.Screen()
    
    turtlepower = []
    
    turtle.tracer(0, 0)
    for i in range(1000):
        t = turtle.Turtle()
        t.goto(random.random()*500, random.random()*1000)
        turtlepower.append(t)
    
    for i in range(1000):
        turtle.stamp()
    
    turtle.update()
    
    time.sleep(3)
    

    This code makes a thousand turtles at random locations, and displays the picture in about 200 milliseconds.

    Had you not disabled screen refreshing with turtle.tracer(0, 0) command, it would have taken several minutes as it tries to refresh the screen 3000 times.

    https://docs.python.org/2/library/turtle.html#turtle.delay

    0 讨论(0)
  • 2020-12-05 14:37
    1. Set turtle.speed() to fastest.
    2. Use the turtle.mainloop() functionality to do work without screen refreshes.
    3. Disable screen refreshing with turtle.tracer(0, 0) then at the end do turtle.update()
    0 讨论(0)
  • 2020-12-05 14:50

    I can't really solve the speed problem, but the freezing can be prevented by using turtle. done() at end of file, thanks

    0 讨论(0)
提交回复
热议问题