【问题标题】:Increase the number of steps Python turtle performs each second?增加 Python 乌龟每秒执行的步数?
【发布时间】:2019-08-26 06:32:17
【问题描述】:

我的班级最近一直在学习 Python 的 Turtle 模块(我收集它使用 tkinter),我想知道是否有办法调整 tkinter/turtle 执行其代码的速率,因为它似乎没有(来自我有限的理解)受到计算机计算能力的限制。我这么说是因为在任务管理器中(如果这会影响任何东西,我在 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 中描述问题也失败了。

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

我注意到,如果海龟的命令需要花费大量时间来计算(例如,通过强制它进行大量荒谬的计算来计算出一个简单的值),那么它确实需要更长的时间来执行每一步,暗示可能只是硬件限制。然而,当使用 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)))

无论如何,这是我的第一个问题,所以我希望我能很好地解释自己。 谢谢。

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    这对您的目的是否足够快:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2017-08-09
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2017-09-27
      • 2013-12-17
      相关资源
      最近更新 更多