在这个程序中,为什么if语句的执行时间总是与前面的函数相同?

问题描述 投票:0回答:1

我正在努力学习更有效的编码。问题是,我的学位实际上并没有提出这个话题;我们的教授严肃地鼓励我们编写复杂的意大利面条代码,这样雇主如果想要我们为他们编写的代码重新工作,就必须重新雇用我们。

鉴于互联网上的错误信息,我决定找出这一点的途径是亲自测试各种功能的时间安排。这件事有很多问题。

例如,无论我尝试多少次,每个函数的平均时间都有很大差异。这可能与我最近的问题有关,也可能无关。出于某种原因,它告诉我 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)

python performance time
1个回答
-1
投票

这是读取所有平均值的更简单方法:

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 进行此类测试。

© www.soinside.com 2019 - 2024. All rights reserved.