使用timeit或time计时两个算法(python)

时间:2014-08-28 17:17:55

标签: 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)
    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)")

程序应该测量运行每个函数所需的时间,然后输出/打印每个程序的运行时间。

2 个答案:

答案 0 :(得分:0)

time.time给出了当前时间。你想要timeit.timeit。

print(timeit.timeit("normal(sound)"))
print(timeit.timeit("onlyMax(sound)"))

但是,您无法将局部变量传递给timeit(how to pass parameters of a function when using timeit.Timer()),因此您可能需要简化功能。您可以重新实现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)

答案 1 :(得分:0)

time.time() function不接受任何参数,因为它是一个简单地返回当前时间的函数(自特定时间点以来,以UNIX形式的秒数形式)。你不能用它比较那样的两个函数运行时。您可以使用它来测量时间,然后在运行函数之前存储该值,然后将其与time.time()值进行比较,但这是衡量性能的不良方法。

timeit.timeit() function 可以让您通过重复执行测试功能以及确保其他可能阻碍准确测量的因素至少最小化来测量测试功能所需的数量。但是,您一次只能测试一个这样的功能。

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

timeit.timeit("normal(sound)", 'from __main__ import normal, sound')

再次为其他功能执行此操作,并将结果相互比较。

考虑到该函数将多次执行(你可以调整多少),所以如果函数改变全局状态,你每次都必须重置该状态。这也会改变你衡量表现的方式。