我需要进行一次功能测试,断言一次运行比另一次运行快得多。

这是我到目前为止编写的代码:

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作为平均规则执行时间,在该时间处执行时间应更快。这是实际参数,具体取决于您对此公式的使用。

10-05 20:31