我的类(class)最近一直在学习 Python 的 Turtle 模块(我收集到它使用 tkinter),我想知道是否有一种方法可以调整 tkinter/turtle 执行其代码的速率,因为它似乎没有(来 self 有限的理解)受限于我的计算机的计算能力。我这么说是因为在任务管理器中(如果影响到任何东西,我在 Windows 上),python shell 只使用 CPU 限制的一小部分(~2%),同样适用于 GPU、RAM、磁盘等。此外,增加它的操作优先级既不会影响我的 CPU 使用量,也不会提高它执行代码的速度。
请注意,我指的不是 turtle 执行由 turtle.speed() 确定的每个 Action 的速度,我已经将其设置为“0”,因此它实际上是瞬时的,我的问题在于似乎是每个步骤之间所花费的时间,似乎限制为每秒 80 个 Action (稍后会详细介绍)。
例如,以下代码在给定一定精度的情况下绘制了抛物线的近似值。精度越高,近似越好,但绘制所需的时间越长,因为它需要更多、更小的步骤。
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?) 通过率 执行率 每秒 Action 每秒步数
但无济于事,尝试在 Google 中描述该问题也失败了。
此外,我根本不明白导致它如此缓慢的潜在瓶颈是什么(或者即使只有一个瓶颈),这使得问题难以解决。
我注意到,如果 turtle 的命令需要花费大量时间来计算(例如,通过强制它进行大量荒谬的计算来计算出一个简单的值),那么它确实需要更长的时间来执行每一步,都表明这可能只是硬件限制。但是,当使用 python timeit 装饰器为执行计时时,它似乎总是每秒为任何函数精确执行一定数量的 Action ,而不管单个 Action 的复杂性,直到一定程度,超过这个复杂性就会开始减慢它向下。所以就好像它发生的速度有一些限制。此外,此特定限制似乎偶尔会发生变化,这表明计算机的状态确实会在某种程度上影响它。
此外,为了以防万一,这是我使用的 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)))
基本上,我已经关闭了 turtle 的动画尝试。我还添加了一条命令,让 turtle 以弧度 思考,这样您就不需要一遍又一遍地调用degrees()
函数。如果你想看一些动画,你可以调整 tracer()
的参数,例如。 turtle.tracer(20)
。
关于python - 增加 Python turtle 每秒执行的步数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57652819/