我想猜测我的算法的计算工作量,在这种情况下意味着:我在算法中添加,减去,乘法和除法的频率。
示例:
def b(a):
a = a + 3 #1
a = a * a #2
a = a * -1 #3
return a
if __name__ == "__main__":
for i in range(10):
b(1)
分析的输出应该是:
1:+ - > 1数学运算
2:* - > 1数学运算
3:+, - - > 2个数学运算
对于每个循环,因此在此程序上运行的分析器应返回 40 。
答案 0 :(得分:1)
Pythonic解决方案可能是创建一个类操作数,带有相关的运算符+, - ,*,/,用特殊方法指定(__add __,__ radd __,__ mult __,__ rmult__等)。如果您使用" __ r"正确的方法你可以开始包括几乎任何顺序的litterals(1,2.0,3.0),只要有一个操作数。
该类将有一个计数器,在创建时设置为零。每次调用都会增加1,但也会添加每个运算符的计数器(默认值= 0)。
然后你可以写:
a = Operand(2)
b = a+2-5
assert b.effort == 3
然后你可以继续计算你的努力:
a = Operand(5)
a = a + 3 #1
a = a * a #2
a = a * -1 #3
print(a.effort)
在第一行中,您将创建对象。在第二行中,+ 3的结果为8,结果对象的努力为1。在第三个中,它的努力为3(1 + 1表示+ 1)。在第四,它努力4.等。
我还没有实施和测试它,但它应该根据这些原则或多或少地起作用。
关于litterals的注意事项: a + 2 + 3会给你一个3的计数,但是2 + 3 + a可能会给你一个2的计数(因为5仍然是一个整数,而不是一个操作数)。所以也许你想避免__r方法,保持安全......这取决于。