作者adgjl5645 (今天不想哭)
标题Re: [问题] 如何提升code品质
时间Mon Apr 10 00:00:45 2017
首先、这样让我们讲到你想要提升什麽层面的 code 的品质
比如说、想要提升的是程式的可读性、执行效能、开发流程还是良好的程式架构?
可读性关系到你的 coding style, 像是变数、函式的命名、indentation (不知道怎麽翻)......等、
这部分会牵扯到非常多的东西、我觉得最好的是 当你在写 python 的时候就要写的够 pythonic、
那要怎麽写的够 pythonic 呢?
首先、你需要对 python 够了解、
比如说你应该听过写 for 回圈的时候不要直接用 range 跟 array[i]、
而是用 for item in array 这种写法、可是有时候我们也需要 index 的资讯啊 该怎麽办?
这种时候就会使用 for i, item in enumerate(a) 这时候 i, item 就会是你要的东西了、
还有很多这种情况、换个小东西就可以让你的 code 更容易阅读而且也接近 python 社群的写法
那拉回来, 现在我知道要写得够 pythonic 比较好了、可是我要怎麽学到这些东西?
总不能把所有 Github 上的 python 专案都看过一遍吧?
当然这不失为一种好方法、多看别人的 code
但除此之外、我推荐你去看 python 官方给的标准 PEPs (Python Enhancement Proposals)
连结在此:
https://www.python.org/dev/peps/
你可以看看 title 把重要的看一看(比如 pep8)
这会让你写的 python 更上一层楼
那除了 pep 之外你也可以去看看一些大型的开源专案的 code 以及他们给的一些 style guide
比如说:
https://google.github.io/styleguide/
这是 google 底下的专案对各种语言的 coding style、也很推荐你去看
那执行效能要怎麽办呢?
这就关乎到演算法了、但只有演算法吗? 不不 请听我娓娓道来、
演算法的确是非常重要的东西、但是有时候会碰到一种情况、因为 python 毕竟是高阶语言、
许多的东西用起来其实跟你想的不一样、list 不是 array, range 不是 list, string concatenation 比想像中慢等等、
所以第一件事情是、先找一个好的演算法、然後简单的用 python 实作、
这时候 python 的好处就出现了、python 让你可以非常快的验证你的想法、
当你确定演算法是对的时候、这时候又回到 pythonic 上面了、我们要来对 python 的性质做优化、
像是 list 太大太吃 memory 就改用 generator、用到 gobal variable 造成查找太耗时移到 local 去、
甚至是写死限制 class attribute 的量加速查询的、这里会有一些眉眉角角的东西、把有大问题的部分去掉、
有些部分可能太细节了不太好更改、於是我们转向平行化看看、如果你的程式会卡大量的 I/O、
你可以转向用 asyncio 、
那如果是纯粹计算吃紧、想用 multi thread 你必须注意到 python 并没有真的 multi thread、
这关系到 python 的 GIL (global interpreter lock) 有兴趣可以自己去查一查、
於是只能用 multi process 了、
那如果我没有多核的 cpu 该怎麽办?
你还有两个选择、一个是使用 pypy 或 numba 那种做 JIT 的 python interpreter 或套件、
另一种就是改将程式的 bottleneck 回到用 C 写、那你就需要理解 python 呼叫 c 时要怎麽做、
开发流程跟程式架构有点关系、比如我们使用非常 OOP 的写法、
程式架构就跟你怎麽继承有关、你开发时也是看需求再往上堆等等、
你可以考虑看看 python design pattern 相关的东西、不过这我并不熟所以就不多提了、
剩下的我们稍後会再提到、
那看了这麽多之後让我们先回到你原本的问题、
: 目前是用Anaconda跟VS code
: 先在Jupyter Console每次写一小个段落後
: trace %history然後在VS code里写成档案debug
: 遇到的问题是, 感觉开发过程好慢
首先 Anaconda 是做套件管理的、但是我个人并不推荐使用、原因是我个人在用 Anaconda 时曾碰过一些
版本啊、环境啊等等的问题、加上我习惯用 virtual environment 管理我的东西才不会跟系统碰撞、
还有 Anaconda 实在是包太多东西了、有一些是我从来就不曾想要用的东西、所以我比较喜欢自己用 pip 管理、
现在的 python 有内建一个 venv 的 module 了、它可以让你分隔你的环境并将套件整理安装在新建的资料夹内、
当然你还是得用 pip 将自己要的套件装进来、但知道你真正需要用什麽也是比较好的
再来 VS code ......
这我必须说 我对X软公司的产品有点偏见、但我建议你要找到一个好的 editor 或 IDE、
像是 Emacs 或 Vim 这种纯文字的 editor 、或是 PyCharm 这种 IDE 都算是不错的选则、
我自己是用 Emacs 拉 :P
不过如果你 VS code 用的最习惯是也没有关系拉
: 每过一段就会出现好几行是为了debug做的微调
: 在修正的时候过程总是
: 除错->得到正确结果->(优化->失败)*n
: 然後history就乱七八操的 看的很累 写起来也超麻烦
: 想想以前写爬虫的时候也是开两个terminal然後一直(切换->对照->修正)
那这边必须提到的是 debug 是一门学问、没有什麽一定的方法、
但有些帮助的技巧、比如说学着写些测试的 code 、这应该是软工会教的东西、
像是 Unittest 啊、python 的 doctest 啊等等、
这种就是开发流程重要的地方、用好的编辑器快速的浏览程式 查找函式的定义 做自动补完及上色、
写好的测试检查是否有错误的地方、使用 git 等版本控管工具比较错误与修改差异、
最後快速的确认程式是否有符合你的需求、决定是否要增加新功能或从头来过
: 还有就是关於lib的利用:
: 普通就是想做什麽就google看看, 通常都可以得到想要的lib跟教学
: 虽然说常用就可以记熟方法, 可是工具千万种, 不断推陈出新
: 加上可能有些工具只用了几次以後, 下次碰到就是几个月後的事
: 即使把写过的东西保留下来方便以後自己查找, 但还是零零散散的
: 我觉得我在整理的过程上消耗了太多时间
: 导致花了两三天 可是写出来的东西很少的感觉
google 这方法是很好的、很多人还不一定知道怎麽 google、
但是这些东西本来就会一直推陈出新、不可能一直使用同样的发法、
所以最好的就是 学会看懂 document、学着去看官方的 document、作者的 document、
只要专案还有在开发(好好的)、那他的 document 也会一起更新、学会看懂并不吃亏、
那 google 到的那些文章或 stackoverflow 的问题呢?这些也是很好的资源、
但他们并不保证上面的东西会是最新的、比较冷门的问题常常都是好几个版本以前的解答了、
其实还是可以参考、但看 document 还是最保险、
那如果运气很差这专案并没有 document 呢?
我只能说、少年啊 看 code 吧、
code 还是最实在、想骗都骗不了人的、document 可以是假的、看 code 才是真的、
培养阅读别人程式码的能力也是很重要的
: 所以我想请问一下:
: 1.各位在程式开发的过程中都是怎麽避免常发生上面问题,
: 或是可以避免掉
: 2.开发时有什麽习惯是应该要培养的, 才能写出品质好的
: 程式码
: '''文笔不好, 有哪边写的不好或是要补充什麽还请各位大大提点
: 我会尽快补充跟修改
: '''
: 感谢各位ob'_'ov
好了那差不多到这边、我讲的有许多是以 python 的标准来看的、
希望是有回答到你的问题、如何写好的 code 这问题本来就是大哉问、
许多人写了十几二十年 code 品质还是烂的要命、
我也希望我可以写出高品质的 code QQ
=========================================================
最後推一下、请爱用最新版本的 python 与支持各个开源社群与专案、
开源是一种理念、我不会说他是一种法条或必须遵守不然就会怎样怎样的东西、
但我觉得就像做善事一样、这是一种为了让世界更美好而做的一种努力以及贡献
========================================================
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.27.55
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1491753657.A.677.html
1F:推 BigBank: 推 04/10 01:10
2F:推 ntumath: 讲的到位 推推 04/10 01:15
3F:推 doun: 大推 04/10 07:25
4F:推 aljohn0422: 好文推,感谢大大分享 04/10 09:04
5F:推 Meshif: 好文推 04/10 09:27
6F:推 kyonkon: 推分享 感谢 04/10 10:11
7F:推 inthela: 感谢 获益匪浅 04/10 10:19
8F:推 gbllggi: 好文推 04/11 02:59
9F:推 vvind: great 04/11 12:33
10F:推 yinxuanh: 推 04/11 12:39
11F:推 ccvs: 推推 04/11 19:10
12F:推 Raymond0710: VSCode还不错啦 Debugger框架作的很好 而且也是开源 04/11 19:33
13F:推 cory8249: PyCharm 好用 +1 04/11 22:44
14F:推 gemini6479: 好文 04/13 01:09
15F:推 berman82312: 好文必须推 04/13 18:25
16F:→ aaaba: conda env 很好用 04/15 01:27
17F:推 s860134: 写得不错 很完整耶 04/15 21:02
18F:推 craig1122321: 好文给推 04/17 22:04
19F:推 sunvictor7: 好文推一个 04/19 16:28
20F:推 cj10243: 推 04/28 22:30
21F:推 andrewkgs: 推 05/22 15:31
22F:推 ichleibeqbi: 05/28 11:01
23F:推 oscarkiller: 推 07/13 15:17