增加乌龟每秒执行的步数 Python?

Increase the number of steps Python turtle performs each second?

我的class最近一直在学习Python的Turtle模块(我收集到的是使用tkinter的),我想知道是否有办法调整[=33]的速率=] 执行它的代码,因为它似乎(根据我有限的理解)不受我计算机计算能力的限制。我这么说是因为在任务管理器中(如果有影响的话,我在 Windows 上),python shell 只使用 CPU 限制的一小部分( ~2%) 以及 GPU、RAM、磁盘等。此外,增加它的操作优先级既不会影响我的 CPU 的使用量,也不会增加它执行代码的速率。

请注意,我指的不是 Turtle 执行由 turtle.speed() 确定的每个动作的速度,我已经将其设置为“0”,因此它实际上是瞬时的,我的问题取而代之的是似乎每个步骤之间所花费的时间似乎限制为每秒 80 个动作(稍后会详细介绍)。

例如,以下代码在给定一定精度的情况下绘制了抛物线的近似值。精度越高,近似越好,但绘制所需的时间越长,因为它需要更多、更小的步骤。

precision=0.1
t.penup()
t.goto(-250,150)
t.pendown()

for n in range(800*precision):
    t.setheading(math.degrees(math.atan(0.02*n-8)))
    t.fd(1)

实际上,对于接近或高于1的精度,它花费的时间比我想要的要长得多,而且一般来说,在Tkinter中绘制精细曲线太慢了,所以我想知道是否有办法调整这个速度.

我在尝试研究解决方案时遇到的部分困难是我根本不知道相关术语是什么,所以我尝试使用模糊相关的术语,包括一些基于硬件的类似物以及其他各种东西这有点类似,例如: 时钟速度 刷新率 帧率 刻度速度(Minecraft ftw?) 通过率 执行率 每秒动作 每秒步数

但无济于事,试图在 Google 中描述问题也失败了。

此外,我根本不明白导致它如此缓慢的潜在瓶颈是什么(或者即使只有一个瓶颈),这使得问题难以解决。

我注意到如果 turtle 的命令需要花费大量时间来计算(例如,通过强制它进行大量荒谬的计算来计算出一个简单的值),那么它确实需要更长的时间执行每个步骤,表明这可能只是硬件限制。但是,当使用 python timeit 装饰器为执行计时时,它似乎总是每秒为任何函数精确执行一定数量的动作,而不管单个动作的复杂性,直到某个点,超过这个复杂度开始放慢速度。所以就好像它发生的速度有一些限制。此外,此特定限制似乎偶尔会发生变化,这表明计算机的状态确实会在某种程度上影响它。

此外,为了以防万一,这是我使用的 timeit 设置:

import timeit

mysetup="""
import math
import turtle as t

def DefaultDerivative(x):
    return 2*x-x

def GeneralEquation(precision=1,XShift=0,YShift=0,Derivative=DefaultDerivative):
    t.penup()
    t.goto(XShift,YShift)
    t.pendown()

    for n in range(0,int(800*precision)):
        t.setheading((math.degrees(math.atan(Derivative(((0.01*n)-(4*precision))/precision)))))
        t.fd(1/precision)

def equation1(x):
    return (2*(x**2))+(2*x)

def equation2(x):
    return x**2

def equation3(x):
    return math.cos(x)

def equation4(x):
        return 2*x

t.speed(0)
"""

mycode="""
GeneralEquation(5,-350,300,equation4)
"""

print("time: "+str(timeit.timeit(setup=mysetup,stmt=mycode,number=10)))

无论如何,这是我的第一个问题,所以我希望我已经解释清楚了。 谢谢。

这对你的目的来说足够快吗:

import timeit

mysetup = """
import turtle
from math import atan, cos

def DefaultDerivative(x):
    return 2 * x - x

def GeneralEquation(precision=1, XShift=0, YShift=0, Derivative=DefaultDerivative):
    turtle.radians()

    turtle.tracer(False)

    turtle.penup()
    turtle.goto(XShift, YShift)
    turtle.pendown()

    for n in range(0, int(800 * precision)):
        turtle.setheading(atan(Derivative((0.01 * n - 4 * precision) / precision)))
        turtle.forward(1 / precision)

    turtle.tracer(True)

def equation1(x):
    return 2 * x ** 2 + 2 * x

def equation2(x):
    return x ** 2

def equation3(x):
    return cos(x)

def equation4(x):
    return 2 * x
"""

mycode = """
GeneralEquation(5, -350, 300, equation4)
"""

print("time: " + str(timeit.timeit(setup=mysetup, stmt=mycode, number=10)))

基本上,我已经关闭了海龟的动画尝试。我还添加了一条命令,让乌龟以 弧度 进行思考,因此您无需一遍又一遍地调用 degrees() 函数。如果你想看一些动画,你可以将参数调整为 tracer(),例如。 turtle.tracer(20).