【发布时间】: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)))
无论如何,这是我的第一个问题,所以我希望我能很好地解释自己。 谢谢。
【问题讨论】: