我需要进行一次功能测试,断言一次运行比另一次运行快得多。
这是我到目前为止编写的代码:
def test_run5(self):
cmd_line = ["python", self.__right_def_file_only_files]
start = time.clock()
with self.assertRaises(SystemExit):
ClassName().run(cmd_line)
end = time.clock()
runtime1 = end - start
start = time.clock()
with self.assertRaises(SystemExit):
ClassName().run(cmd_line)
end = time.clock()
runtime2 = end - start
self.assertTrue(runtime2 < runtime1 * 1.4)
它可以工作,但是我不喜欢这种方式,因为1.4因子是通过我的具体执行示例实验性地选择的。
您将如何测试第二次执行总是比第一次执行快?
编辑
我认为没有必要对此进行解释,但是在我的程序上下文中,我不能说一个因素对于未知的执行是重要的。
整个程序是一种
Make
,它是管道定义文件,它将定义什么是“速度的显着差异”,而不是我:如果定义文件包含很多非常快的规则,则两次连续执行之间的执行时间之差将很小,比如说快了5%,但仍然很重要
否则,如果定义文件中包含的规则很少,但是规则非常长,则差异将很大,比如说快90%,那么5%的差异根本就不重要。
最佳答案
我找到了一个满足我需求的名为Michaelis-Menten kinetics
的方程式。这是应该起作用的功能
def get_best_factor(full_exec_time, rule_count, maximum_ratio=1):
average_rule_time = full_exec_time / rule_count
return 1 + (maximum_ratio * average_rule_time / (1.5 + average_rule_time))
full_exec_time
参数是runtime1
,它是给定管道定义文件的最大执行时间。rule_count
是给定管道定义文件中的规则数。maximum_ratio
表示第二次执行最多比第一次执行快100%(实际上是不可能的)Michaelis-Menten kinetics
公式的可变参数是平均规则执行时间。而且我任意选择1.5 seconds
作为平均规则执行时间,在该时间处执行时间应更快。这是实际参数,具体取决于您对此公式的使用。