有什么办法可以避免 Turtle 减慢它必须打印的行数?

Is there any way I can avoid Turtle slowing down the more lines it has to print?

我制作了一个程序来生成一个由 1 和 0 组成的随机二维数组,然后我将其打印为蓝色背景上方的绿色“陆地”瓷砖以生成一点 'map'。我已尽力优化代码,但当我尝试打印超过 100x100 的任何内容时,速度会大大降低。如果我将它设置为逐行打印,我会发现随着 map turtle 已经打印的越多,打印行所花费的时间就越长。我不知道这是为什么(我不太了解乌龟或一般渲染)但我很想知道如何解决这个问题。 如果这是不可能的,我可以推荐其他 libraries/languages 来尝试吗?我想做更多这样的程序,我不介意学习新东西。 :)

这是我的代码:

import turtle
import random
import time

d = turtle.Turtle()
d.ht()
wn = turtle.Screen()
wn.setup(width=0.45,height=0.8,startx=800,starty=50)
wn.bgcolor("#002240")
turtle.tracer(0,0)
d.penup()
interval = 10

def square(col) :
    d.pendown()
    d.color(col)
    d.begin_fill()
    for i in range(4) :
        d.fd(interval)
        d.right(90)
    d.end_fill()
    d.penup()

size = int(input("Enter map size  "))
custom_interval = input("Custom interval?  ")
if custom_interval != '' :
    interval = int(custom_interval)
int_by_size = interval * size

start_gen = time.time()
data = []
for i in range(size) :
    gen_line = []
    [gen_line.append(random.randint(0,1)) for i in range(size)]
    data.append(gen_line)
end_gen = time.time()
print("GEN DONE IN",end_gen-start_gen)

d.goto(-int_by_size/2,int_by_size/2)
start_draw = time.time()

d.pendown()
d.color("blue")
d.begin_fill()
for i in range(4) :
    d.fd(int_by_size)
    d.right(90)
d.end_fill()
d.penup()

for y,line in enumerate(data) :

    for x,tile in enumerate(line) :

        if tile == 1 :
            square("green")
            d.fd(interval)
        else :
            d.fd(interval)

    #Comment out to print entire map at once
    turtle.update()
        
    d.backward(int_by_size)
    d.sety(d.ycor()-interval)
    
end_draw = time.time()
print("DRAW DONE IN",end_draw-start_draw)
           
wn.exitonclick()

我通过从 drawing 切换到 stamping 和其他技巧,对下面的代码进行了修改,使绘图速度提高了一个数量级:

from turtle import Screen, Turtle
from random import randint
import time

CURSOR_SIZE = 20

interval = 10

size = int(input("Enter map size: "))
custom_interval = input("Custom interval: ")
if custom_interval != '':
    interval = int(custom_interval)
int_by_size = interval * size

screen = Screen()
screen.setup(width=0.45, height=0.8, startx=800, starty=50)
screen.bgcolor('#002240')
screen.tracer(False)

x, y = interval/2 - int_by_size/2, int_by_size/2 - interval/2

start_gen = time.time()

data = [(randint(False, True) for _ in range(size)) for _ in range(size)]

print("GEN DONE IN", time.time() - start_gen)

start_draw = time.time()

turtle = Turtle()
turtle.hideturtle()
turtle.shape('square')
turtle.penup()

turtle.color('blue')
turtle.shapesize(int_by_size / CURSOR_SIZE)
turtle.stamp()

turtle.color('green')
turtle.shapesize(interval / CURSOR_SIZE)
turtle.goto(x, y)

for line in data:
    dx = x

    for tile in line:
        if tile:
            turtle.setx(dx)
            turtle.stamp()

        dx += interval

    # Comment out to print entire map at once
    screen.update()

    y -= interval
    turtle.goto(x, y)

print("DRAW DONE IN", time.time() - start_draw)

screen.tracer(True)
screen.exitonclick()

您可能需要撤消我的一些优化,例如将数据设为生成器列表而不是列表列表(加快数据生成速度,但仅适用于单次传递。)此外,请记住 window width=0.45, height=0.8 的尺寸是相对于 你的 屏幕的尺寸的——其他人 运行 在其他屏幕上会得到不同的尺寸 window.