Algorithm 使用timeit或time对两种算法(python)计时

Algorithm 使用timeit或time对两种算法(python)计时,algorithm,python-2.7,audio,time,timeit,Algorithm,Python 2.7,Audio,Time,Timeit,我在使用time或timeit函数确定python中两个算法的运行时时时遇到了一些问题。到目前为止,我有这个 def normal(sound): for s in getSamples(sound): largest=max(0,getSampleValue(s)) amplification = 32767.0/largest for s in getSamples(sound): louder = amplification*getSampleValue(s

我在使用time或timeit函数确定python中两个算法的运行时时时遇到了一些问题。到目前为止,我有这个

def normal(sound):
  for s in getSamples(sound):
    largest=max(0,getSampleValue(s))
    amplification = 32767.0/largest
  for s in getSamples(sound):
    louder = amplification*getSampleValue(s)
    setSampleValue(s,louder)

def onlyMax(sound):
  for s in getSamples(sound):
    value=getSampleValue(s)
    if value>0:
      setSampleValue(s,32767)
    if value<=0:
      setSampleValue(s,-32768)

import time
def timetwoalgorithms(sound):
    print time.time("normal(sound)","onlyMax(sound)")
程序应测量运行每个函数所需的时间,然后输出/打印每个程序的运行时间。

给出当前时间。你想要时间,时间

print(timeit.timeit("normal(sound)"))
print(timeit.timeit("onlyMax(sound)"))
但是,您不能将局部变量传递给timeit,因此您可能必须简化您的函数。您可以重新实施timeit:

def timeit(exec_s, globals={}, number=10000):
    t = time.time()
    for i in range(number):
        exec(exec_s, globals)
    return time.time() - t

print(timeit("normal(sound)", locals()))
print(timeit("onlyMax(sound)", locals()))
或者按照@Martijn Pieters答案将变量放置在模块名称空间中。 或者,将定时回路合并到主功能中:

def time2algorithms(sound, number=10000):
    t = time.time()
    for i in range(number):
        normal(sound)
    print(time.time() - t)
    t = time.time()
    for i in range(number):
        onlyMax(sound)
    print(time.time() - t)
timeit.timeit("normal(sound)", 'from __main__ import normal, sound')
不接受任何参数,因为它是一个函数,只以秒的形式返回自特定时间点(UNIX纪元)以来的当前时间。您不能使用它来比较两个这样的函数运行时。通过在运行函数之前存储值,然后在运行函数之后将其与time.time值进行比较,您可以使用它来测量时间流逝,但这是一种糟糕的测量性能的方法

通过重复执行测试函数,并确保可能妨碍准确测量的其他因素至少最小化,确实可以测量测试函数所需的时间。但是,一次只能测试一个这样的函数

要测试一个函数,请传入Python源代码以运行该函数,并传入另一个函数以设置测试。该设置应包括导入功能:

def time2algorithms(sound, number=10000):
    t = time.time()
    for i in range(number):
        normal(sound)
    print(time.time() - t)
    t = time.time()
    for i in range(number):
        onlyMax(sound)
    print(time.time() - t)
timeit.timeit("normal(sound)", 'from __main__ import normal, sound')
对另一个函数再次执行此操作,并相互比较结果


考虑到函数将执行多次,您可以调整执行次数,因此如果函数更改全局状态,您必须每次重置该状态。这也将改变您衡量性能的方式。

我不确定我是否完全理解timeit或time函数,但如果能提供一些帮助,我将不胜感激,因为我似乎无法在Stack中找到答案。我对此写了一个答案。好的,所以当我在函数中实现timeit时,我是否应该用函数名替换exec_s?我收到的错误应为变量。如果没有,我想我没有itexec_的句柄,因为它是一个要执行的字符串,就像timeit.timeit一样。它可以是字符串形式的任何可执行python。因此,在您的情况下,它要么是normalsound,要么是onlyMaxsound。但是,如果您不想使用helper函数,可以用normalsound替换exec_s、globals。请参阅编辑。这似乎现在起作用了,但是当它试图通过时间循环执行范围程序时,我再次收到线程死亡