Python学习阶段性总结(3.18-4.18)(1)

系列说明

每个月的18号,就做一次小总结,把本月掌握的知识,学到的经验,汇总起来,也算是对自己的一钟督促。

本月收获

1.关于对熟练某种编程语言的理解

我觉得包含以下三点要求

  1. 能快速构建一个程序
    这一点不要求算法多么的高效,而是侧重,看到一个问题,能迅速想到一个可用的算法,并用你学习的编程语言实现出来。(之后你会发现,当你写出了第一个解法后,找出更高效的算法会非常简单。)

  2. 了解哪些语句执行效率快
    在这个月的实践中,我写过不少程序,试过用不同的语句实现同样的功能,于是发现了,在一门编程语言里面,总会有实现起来特别快的操作,于是,知道它们是哪些,编程的时候,优先选择,这样写出来的程序肯定慢不到哪去。
    这里几篇博客是挺好的例子,如 python中,for循环就是会比 while循环快, i ∗ i i*i ii就是会比 i ∗ ∗ 2 i**2 i2快(传送门)

  3. 合理使用“空间换时间”的策略
    编程实践过程中,对于“编程是关于空间和时间的艺术”这句话有了更深的理解。对于一个算法,内部均是对于空间的使用(指内存)或是时间的使用(运行时间)的平衡。对于现代计算机,内存一般不是限制我们编写程序的大问题了,于是,我们更多考虑的是以空间换时间的策略,比如生成随机数 (传送门),亲密数的求解(传送门),求解素数的 Eratosthenes算法(传送门)
    不过,在实践过程中,我也发现了一些反例,即滥用“空间换时间策略”,会导致程序运行更慢,这里面典型的例子是求验证歌德巴赫猜想的问题 (传送门),这里面方法2,滥用了太多空间,反而拖慢了程序,本来0.9秒可以完成的,因为数组太大,反而需要用150多秒去完成。

2. 其他一些小收获

  1. 尽可能减少程序的判断次数,每做一个判断,想想这个是不是必要的,或是能否用其他方式替换。for 循环比 while 循环快的根本原因在于,for 循环里面没有判断!这个大家可以好好琢磨下

  2. 对于Python来说,在数组里根据索引查找一个数,不管索引多大,均可以理解为是花同样的一个基本时间,而判断一个数,在不在一个数组里( i n in in 操作符),这里面作的比较是非常多的,结合第一点理解,会导致程序难以接受的慢,这里最典型的例子是验证歌德巴赫猜想的程序,两种方法效率差了4000倍 (传送门) 能转换成数组索引查找的,就不要在数组中搜寻一个数

  3. 高效的算法很重要,素数的判断是最好的体现,使用 Eratosthenes算法,求解100万以内的所有素数,耗时仅需要0.2秒左右 (传送门),这是因为,这个算法,把原来的“找素数”转换成“排除合数”的问题啦,这个好好想想为什么观念的一转变,就能带来效率的大提升~

    好吧,不买关子了~因为排除合数只需要找到一个因子就能排除了,而确定一个数是素数可是得一直除到它的平方根才能停啊!想想这里面运算量的差别!

总结

上面的内容虽然分散,却也隐含了逻辑关系。首先,要求我们对自己手头使用的编程语言要熟,要知道最优的语句,之后,才是找最优的算法去解决问题,二者缺一不可。

我这个月研究的问题,都是很简单的数学问题,但里面需要运用到的编程思想及编程技巧,却是实打实的~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值