Python 3.x 海龟图形运行非常慢?

3 投票
3 回答
9712 浏览
提问于 2025-04-18 18:48

我发现Python的海龟绘图功能非常慢。我本来预期会有一些延迟,但没想到要等几分钟才能画出一个相对简单的分形图(Koch曲线,迭代5次)。

即使我设置了turtle.speed(0),它仍然很慢。也许是有bug,因为它并没有像文档中所说的那样瞬间完成?

这个回答建议通过隐藏窗口来重新实现海龟绘图。还有一个类似的问题没有得到回答。我是不是漏掉了什么,还是说重新实现是解决办法?

这是我简化后的代码(生成l系统几乎是瞬间完成的):

import turtle

def l_system(V, w, P, n):
    current = w

    for i in range(n):
        current = [P[x] if x in P else x for x in list(current)]
        current = ''.join(current)

    return current

def run_turtle(var, start, rules, iters, angle, size, scale):
    terry = turtle.Turtle()
    terry.pensize(1)
    terry.pencolor("blue")
    terry.speed(0)

    dist = size / ((iters + 1) ** scale)
    positions = []
    angles = []

    instructions = l_system(var, start, rules, iters)

    for instr in instructions:
        if instr in ('F', 'G'):
            terry.forward(dist)

        elif instr in ('M', 'N'):
            terry.penup()
            terry.forward(dist)
            terry.pendown()

        elif instr == '[':
            positions.append(terry.pos())
            angles.append(terry.heading())

        elif instr == ']':
            terry.goto(positions.pop())
            terry.setheading(angles.pop())

        elif instr == '+':
            terry.left(angle)

        elif instr == '-':
            terry.right(angle)

    turtle.mainloop()

def right_koch():
    run_turtle(('F',), 'F', {'F':'F+F-F-F+F'}, 5, 90, 500, 3)

right_koch()

3 个回答

0

这样复制粘贴会更快:

from turtle import Turtle, speed, delay, tracer, update, done
def initialize():
 speed(0)
 delay(0)
 tracer(0,0)
 turt = Turtle()
 turt.ht()
 return turt
def finish():
 update()
 done()

所有内容都来自 @user2357112

2

这里有个简单的复制粘贴,适合任何需要的人。感谢 @user2357112 的分享。

使用这些方法可以大大加快速度,直接达到最终结果:

.speed(0)
.delay(0)
.ht()
.tracer(0, 0)

# Code goes here

.update()
19

关闭绘图延迟:

turtle.delay(0)

并隐藏小海龟:

terry.ht()

关闭绘图延迟是最重要的。如果不这样做,每次小海龟移动时都会有10毫秒的停顿。


如果你想让它更快,而且只关心最后的图像,你可以完全关闭屏幕更新:

turtle.tracer(0, 0)

然后在小海龟执行完所有命令后只调用一次 update

terry.update()

在关闭追踪和手动调用 update 的情况下,我的程序几乎是瞬间完成的。

撰写回答