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

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


  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()


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 turtleimport randomimport timescreen = 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


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 mathclass 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.ydef xcor(self):    return self.xdef ycor(self):    return self.ydef 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 -= angledef left(self, angle):    self.angle += angledef 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 = forwardbk = backwardback = backwardrt = rightlt = leftsetposition = setposgoto = setpospos = positionut = UndrawnTurtle()