Re: [問題] 如何提升code品質

看板Python作者 (今天不想哭)時間7年前 (2017/04/10 00:00), 編輯推噓22(2201)
留言23則, 23人參與, 最新討論串4/4 (看更多)
首先、這樣讓我們講到你想要提升什麼層面的 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://www.ptt.cc/bbs/Python/M.1491753657.A.677.html

04/10 01:10, , 1F
04/10 01:10, 1F

04/10 01:15, , 2F
講的到位 推推
04/10 01:15, 2F

04/10 07:25, , 3F
大推
04/10 07:25, 3F

04/10 09:04, , 4F
好文推,感謝大大分享
04/10 09:04, 4F

04/10 09:27, , 5F
好文推
04/10 09:27, 5F

04/10 10:11, , 6F
推分享 感謝
04/10 10:11, 6F

04/10 10:19, , 7F
感謝 獲益匪淺
04/10 10:19, 7F

04/11 02:59, , 8F
好文推
04/11 02:59, 8F

04/11 12:33, , 9F
great
04/11 12:33, 9F

04/11 12:39, , 10F
04/11 12:39, 10F

04/11 19:10, , 11F
推推
04/11 19:10, 11F

04/11 19:33, , 12F
VSCode還不錯啦 Debugger框架作的很好 而且也是開源
04/11 19:33, 12F

04/11 22:44, , 13F
PyCharm 好用 +1
04/11 22:44, 13F

04/13 01:09, , 14F
好文
04/13 01:09, 14F

04/13 18:25, , 15F
好文必須推
04/13 18:25, 15F

04/15 01:27, , 16F
conda env 很好用
04/15 01:27, 16F

04/15 21:02, , 17F
寫得不錯 很完整耶
04/15 21:02, 17F

04/17 22:04, , 18F
好文給推
04/17 22:04, 18F

04/19 16:28, , 19F
好文推一個
04/19 16:28, 19F

04/28 22:30, , 20F
04/28 22:30, 20F

05/22 15:31, , 21F
05/22 15:31, 21F

05/28 11:01, , 22F
05/28 11:01, 22F

07/13 15:17, , 23F
07/13 15:17, 23F
文章代碼(AID): #1OwbgvPt (Python)
文章代碼(AID): #1OwbgvPt (Python)