如何判断函数的执行效率

将下面的函数按照执行效率高低排序。它们都接受由0至1之间的数字构成的列表作为输入。这个列表可以很长。一个输入列表的示例如下:[random.random() for i in range(100000)]。你如何证明自己的答案是正确的。

def f1(lIn):
    l1 = sorted(lIn)
    l2 = [i for i in l1 if i<0.5]
    return [i*i for i in l2]

def f2(lIn):
    l1 = [i for i in lIn if i<0.5]
    l2 = sorted(l1)
    return [i*i for i in l2]

def f3(lIn):
    l1 = [i*i for i in lIn]
    l2 = sorted(l1)
    return [i for i in l1 if i<(0.5*0.5)]
这是一道面试题,网上给出的答案有些是错误的,我通过理论和实验进行分析一下。

分析函数执行效率,关键需要知道的就是每个步骤的时间复杂度。

上面的三个函数都是用了一个sorted()函数和两个for循环,for循环的时间复杂度很明显是O(n),关键看sorted()函数的时间复杂度。

在所有的排序算法当中,平均时间复杂度最低的是O(nlogn),python的内置排序函数sorted()的时间复杂度肯定是>=O(nlogn)。


所以sorted()函数的时间复杂度是要大于两个for循环的时间复杂度的,sorted()函数处理的数据越多,效率越低。

f1()和f3()需要对所有的数据进行排序,而f2()只需要对一半的函数进行排序,所以f2()的效率要高于f1()和f3()。

对于f1()和f3(),不太容易通过观察分辨哪个效率更高一些,只能通过实验证实了,通过实验发现f3()要略微优于f1()。

实验的话,可以通过python的cProfile.run()方法

测试结果如下图:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值