关于这段时间做python程序的一点总结

最近呢,老师布置了一个任务。本来以为是改一个java程序的小bug,后来发现是数据集格式的问题。后来跑了一个星期,在老师的提醒下才发现程序逻辑有问题,开始排查死循环。在排查问题、改进算法的过程中,开始发现一个又一个隐藏的bug,也解锁了一天速成python的新技能。过程艰辛,收获也丰富。终于今天可以休息了,停下来好好休整下,整理这段日子中发现的问题与学习的经验。

编程方面

(1)关于“以指定概率选择元素”:
学姐有个方法比较巧妙,依据pi(di/sum(dk))来选择元素。学姐的方法是,在一个sequence中,放入di(元素ui的度数)个ui,再产生一个sequence.size()范围内的随机数,这样就实现了依概率选择元素。
依概率选择的答题思想就如同转盘算法,每个元素的概率多大,就指定多大长度的一段区间。在整个区间上产生随机数,落在哪个区间里,便是选中了哪个元素。


(2)学姐的代码里还有一个经常出现的错误,就是写后读的错误,用个小代码解释下。

for i,j in user:
    ope1(i,j)//使用了i,j的属性a
    change(i.a)//修改属性a的值    

这种问题其实并不容易发现。乍一看并没有什么问题,发现了运行结果错误也不知问题在哪。其原因在于,运行时,循环中的操作会使先被操作的对象的属性值修改,而后被操作的对象的属性值未被修改,造成使用的数据不一致,也就导致了错误。应当统一修改后再统一使用,或者统一使用完再统一修改。


(3)一天速成python也是够我好好感慨的了。最大的收获就是,一定要动手。学过好几门语言了,编程思想也建立了。语言只是一门工具,并不应该被它所限制。快速地扫一下语法,就开始动手写程序。从短的、简单的开始,刚开始肯定不适应,一写一个bug,上手之后就感觉比java方便,啊哈哈哈。


(4)程序处理的数据集比较大,使用矩阵存储时又可能会有大量空间是0,造成资源浪费。学姐的方法是,采用字典变量进行存储,类似于稀疏矩阵。


(5)矩阵计算的部分,在缩小数据集的规模后,可以使用一个完整的大矩阵进行预算。但由于有个数据集的uid不连续,虽然只有9000多个user节点,但最大的uid却到了50000多。问题的核心在于使用矩阵的元素与user节点对应时,应当以元素所在的位置position与矩阵中的i对应。刚开始没想清楚,以为要把整个代码中涉及uid的部分全部换成position,还好当时想到这么大工作量,一下子就把我吓清醒了。


(6)程序由于算法的问题,可能会在运行时发生死循环。判断死循环是关键。我最初想的是依据时间或循环次数进行大略的判定,比如运行了10分钟或循环了点集大小的两倍的次数后仍没有新的边生成,就判定死循环发生了。这样做其实并不严谨。死循环的判定应该根据程序具体逻辑来操作。在这个程序里,要在sequence里找vi和vj来进行边的生成,那么死循环的条件就是所有组合的vi和vj均不能生成边。刚开始的做法其实想到的时候就觉得笨,也只能先用上了。为每个user对象加一个sel1和sel2属性,若选为vi,则vi.sel1=true,若选为vj,则vj.sel2=true。循环中会检查是否每个user的sel2均为true,若是,则该次循环的vi已无法找到符合条件的vj,则把所有的sel2置为false,跳出循环尝试下一个vi。若所有vi的sel1均为true,则发生死循环。这样做,麻烦,容易错,而且白白为对象加了两个属性,并不太好。后来有天睡醒,突然清醒了。选中的vi加入集合loop1,选中的vj加入集合loop2。若loop2|sequence==loop2,则本次vi的循环发生死循环,应跳出循环。不论此次vi的循环是否生成边,均应将loop2置空。每次vi的循环结束若生成边,则将vi从loop1移除。若loop1|sequence==loop1,则发生死循环。这样清晰简洁得多,给自己赞一个!


其他方面

调试的时候,脑子比较混乱,遇到的问题也是千奇百怪。虽然拿笔记下来了,可是写得也不集中,不方便集中分析问题,以后还是要规范整齐地整理在一起,利于调试、发现问题。
在进行矩阵运算的改进时,头脑不清晰给我很大的阻碍。万万没想到老师口中的“数学基础不好”给了我很大的阻力。计算相关度时,在整理思路的过程中,我执着于用老师的算法手算,忽略了其本质是矩阵的乘法,而这也应该是最准确最快捷的方法。尴尬的是,在进行概率的计算时,居然发现自己忘记了矩阵的乘法。道阻且长啊!!
在算法改进的过程中,老师和学姐一直都是担任的算法设计者的角色,而我的积极性不太够(或者说我对算法的理解不够透彻,没办法参与到设计的过程中)。在实现时,我会发现算法的漏洞,这时,一定要坚信事实,抓住矛盾点,锁定错误的原因。
做事要抓本质,这一点一定要牢记。老师也是这样教我的,只有抓住了本质,才能知道如何优化如何改进,不要只顾着低头写程序,不要满足于写出了一个能用的程序。

大概就是这些了,剩下的编程方面的问题,待会专门整理博客。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值