我正在努力学习更有效的编码。问题是,我的学位实际上并没有提出这个话题;我们的教授严肃地鼓励我们编写复杂的意大利面条代码,这样雇主如果想要我们为他们编写的代码重新工作,就必须重新雇用我们。
鉴于互联网上的错误信息,我决定找出这一点的途径是亲自测试各种功能的时间安排。这件事有很多问题。
例如,无论我尝试多少次,每个函数的平均时间都有很大差异。这可能与我最近的问题有关,也可能无关。出于某种原因,它告诉我 if 语句始终与前面的函数完全花费相同的执行时间,无论它是什么。起初,这是一个打印声明。我认为执行不执行其行的 if 语句应该与任何其他单个命令兼容,这应该不会太令人惊讶。此外,当我让它测试增量语句时,也发生了同样的事情;所有三个总是输出相同的结果。 if 语句唯一不同的时候是我让 if 语句触发了 then 语句。考虑到 print 命令的差异,很难说它有多可靠,但 if 语句的结果显然不仅仅是同一 print 语句本身的两倍。
但是,我随后添加了两个函数来看看 for 循环与简单地复制一行 10 次相比有何不同。它声称 for 循环比 10 行打印更好。但是,执行时间远远超过单个打印语句,并且 if 语句现在返回与 10 行打印行相同的值!
这里发生了什么?我的程序真的产生了真实的结果吗?我遇到了某种故障吗?如果我无法找出高效代码的组成部分,我怎么可能知道如何编写高效代码呢?我正在尝试比较不同的语句,以便我可以回答诸如“这里使用 if 语句实际上会比不使用更有效吗?”之类的问题。这个程序发生了什么来生成这些结果?
import time
avg=0
tries=100
true=True
false=False
for i in range(tries):
t0=time.monotonic_ns()
print("Test string")
t1=time.monotonic_ns()
avg+=t1
avg-=t0
print("Print Command:",avg/tries/1000000)
for i in range(tries):
x=0
t0=time.monotonic_ns()
x+=1
t1=time.monotonic_ns()
avg+=t1
avg-=t0
print("Increment Int:",avg/tries/1000000)
for i in range(tries):
t0=time.monotonic_ns()
for i in range(10):
print(true)
t1=time.monotonic_ns()
avg+=t1
avg-=t0
print("For Loop 10:",avg/tries/1000000)
for i in range(tries):
t0=time.monotonic_ns()
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
t1=time.monotonic_ns()
avg+=t1
avg-=t0
print("10 Commands:",avg/tries/1000000)
for i in range(tries):
t0=time.monotonic_ns()
if false:
print("Test string")
t1=time.monotonic_ns()
avg+=t1
avg-=t0
print("If Statement:",avg/tries/1000000)
这是读取所有平均值的更简单方法:
import time
avg = 0
tries=1000
true=True
false=False
output = []
for i in range(tries):
t0=time.monotonic_ns()
print("Test string")
t1=time.monotonic_ns()
avg+=t1
avg-=t0
output.append("Print Command: "+str(avg/tries/1000000))
for i in range(tries):
x=0
t0=time.monotonic_ns()
x+=1
t1=time.monotonic_ns()
avg+=t1
avg-=t0
output.append("Increment Int: "+str(avg/tries/1000000))
for i in range(tries):
t0=time.monotonic_ns()
for i in range(10):
print(true)
t1=time.monotonic_ns()
avg+=t1
avg-=t0
output.append("For Loop 10: "+str(avg/tries/1000000))
for i in range(tries):
t0=time.monotonic_ns()
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
print(true)
t1=time.monotonic_ns()
avg+=t1
avg-=t0
output.append("10 Commands: "+str(avg/tries/1000000))
for i in range(tries):
t0=time.monotonic_ns()
if false:
print("Test string")
t1=time.monotonic_ns()
avg+=t1
avg-=t0
output.append("If Statement: "+str(avg/tries/1000000))
print('\n'.join(output))
由于您在循环中使用打印,因此最好将您关心的主要打印存储在列表中,然后在最后将它们全部打印在一起。
我没有添加@Anonymous12358建议来重置平均值,因此这不是答案,因此您可以复制并粘贴到您的问题。
此外,您可能想使用 timeit 进行此类测试。