用array還是list?要為了喝牛奶而養一頭牛嗎?

更新於 2022/02/11閱讀時間約 5 分鐘
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
既然沒有內建array,那就找替代方案吧!替代方案有兩個,一個是用list,另一個是用array或numpy這兩個module。
根據官網的文件說明,list的time complexity和C、Pascal的array一樣,而array這個module所提供的method,在index的時候, 速度會比list稍慢。既然「稍慢」,那應該不會慢到像蝸牛散步這種讓人抓狂的慢才對。不過有一個官網沒提到的問題是,array這個module只能處理一維的array,而我需要的,是二維的array。把二維array轉成一維array來處理,對於被matlab蹂躪過的人來說,實在是小菜一碟。怎麼說呢?因為matlab的迴圈是出了名的慢,尤其是巢狀迴圈,那真的就是蝸牛散步了,所以遇到巢狀迴圈時,如果很在乎速度,都會想辦法減少迴圈的層數。處理二維array時,如果需要用到兩層迴圈,那就把二維array轉成一維array,這樣就不需要兩層迴圈了。當然啦,matlab提供了一些方便的function來處理這些問題,只是明明可以很直觀處理的問題,因為程式語言本身特性的關係,還必須花費額外的心力來搞這些有的沒有的,有時還真是讓人圈圈叉叉的,難怪現在程式語言越來越多,而且替換速度越來越快,畢竟要處理的問題越來越複雜,型態也越來越多樣化,順了姑意,逆了嫂意,沒法大家都滿意。
如果採用array這個module,那就要自己寫function來處理二維、一維array的轉換問題,這似乎不是個好主意。至於numpy這個module呢?看來是好用許多,寫起來應該會很順暢。不過……最後決定還是用list來寫。為什麼咧?其實原因很簡單,既然是剛開始學,那就該把基本內建的東西摸熟一點,所以除非萬不得已,就別用一些有的沒的module吧!
其實要不要用別人寫好的東西,是個很有趣的問題,仔細追究起來,跟工、商業上的許多發展軌跡與碰到的問題,還真是有著異曲同工之妙。
在以前open source還沒這麼遍地開花的年代,別人的東西就意味著白花花的銀子。所以囉,要不要為了喝牛奶而養一頭牛,就成了挺令人傷腦筋的問題。一切都自己來,好處是可以掌控全局,哪邊可能會有問題都一清二楚,品質掌握在自己手上,但缺點是要從頭做起,需要的時間長,能燒的鈔票要夠多,才能燒出結果。那如果用別人的東西呢?好處是,很多工作別人都做好了,不用自己來,開發時間可以縮短許多。缺點呢,就是外來的東西品質要如何確保,是個難題。還有啊,以後版本升級時,可能還要再花錢。還有啊,萬一它倒了怎麼辦?!還有啊,萬一它被其他公司買走,而買它的那家公司,收費、授權方式都改了,這時候怎麼辦?!萬萬萬一,買它的那家公司,居然就是你的競爭對手,那…… Java就是個活生生血淋淋的例子。Java原本是Sun的,然後Oracle買下了Sun。Google的Android用到Java,然後Oracle告Google。這裡頭牽扯到的授權問題複雜得很,雖然法院後來判Google勝訴,但誰也說不準接下來會不會有續集。
現在open source這麼多,只要遵守授權規定,白花花的銀子可以少花很多了,只是其他問題依舊存在。就拿品質來說吧,幾年前就發生過這麼一件事,沒記錯的話,應該是有隻非常多人用的程式發現了bug,引起了非常大的騷動。只是好玩的是,那隻程式短短的沒幾行,就只是處理簡單的字串而已,自己寫的話,也花不了幾分鐘。只是啊只是,大家現在都用別人的東西用習慣了,反正又不花錢,於是就連很基本隨手可以處理的問題,都要拿別人的東西來用,而且可能會毫無戒備的認為,這些大家都在用的東西一點問題都沒有,才會有這樣的事情發生。
想到工業界的例子。台積電,這個被吹捧為「護國神山」的大公司,就是靠著幫別人養牛的商業模式崛起的。原本的產業結構是一條龍全包式的,Intel就是這麼樣的一家公司。想要進入這樣的產業,除了銀子要比山高之外,還得要上、中、下游的技術全都具備,那可就不是一個「難」字可以形容的了。不過自從台積電搞了個晶圓代工的新商業模式之後,整個產業結構產生了很大的變化,IC設計公司也才如雨後春筍般出現,這些IC設計公司要是沒有晶圓代工廠幫忙,應該很多連出生的機會都沒有,更不要說像現在這麼會賺錢了。
說實在的,我覺得以投資人的眼光來看,公司就只有讓你賺錢的和讓你賠錢的這兩種,什麼「護國神山」,那是拿來矇人的。有再響亮的名號,如果不能讓你賺到錢,那就該棄之如敝屣,犯不著為了個別人吹噓出來的名號,和自己的銀子過不去。
總之,用與不用別人寫的東西,各有各的優缺點,就像解optimization的問題一樣,絕大部分都只能找到local optimum,很難有絕對的標準可以找到global optimum。所以囉,既然沒時間壓力,可以不講求效率,那能自己寫就自己寫,一杯咖啡、一曲音樂,零食…… 沒有,會肥!悠悠哉哉地享受寫程式的樂趣囉。
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
15會員
130內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
在看官網文件時,看到一份文件:PEP 8 -- Style Guide for Python Code。這份文件是關於Python程式碼風格的指引和建議。
讀完文件,接下來就是要動手了。第一步要先安裝Python。爬了些文,最後決定安裝Anaconda。
學程式最怕的,就是抱著書猛啃,把書背得滾瓜爛熟,真正要寫的時候,反而一行都寫不出來。
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
在看官網文件時,看到一份文件:PEP 8 -- Style Guide for Python Code。這份文件是關於Python程式碼風格的指引和建議。
讀完文件,接下來就是要動手了。第一步要先安裝Python。爬了些文,最後決定安裝Anaconda。
學程式最怕的,就是抱著書猛啃,把書背得滾瓜爛熟,真正要寫的時候,反而一行都寫不出來。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
Thumbnail
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
Thumbnail
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
Thumbnail
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
Thumbnail
題目會給定我們一個陣列和參數k,要求我們將陣列右旋k次,然後輸出內容。 例如[1,2,3,4,5] 右旋 2次,輸出就是[4,5,1,2,3]
Thumbnail
在Laravel collection sortBy之後發現原本的array格式在資料回傳後居然變成json格式,以下依序描述問題與解法: 有一包data如下: $data = collect($data); 現在sortBy show_order欄位後,結果如下: $data = collect
Thumbnail
之前跳過的題目,回來補完成。 Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4]
Thumbnail
比今天的題目示例如下: Input: nums = [-4,-1,0,3,10] Output: [0,1,9,16,100] 簡單來說,要的輸出結果是把陣列內每個數字取平方後,對陣列做排序。
Thumbnail
近年我國政府大力的倡議 5+2領域的重點產業轉型,其中循環經濟是一個核心的重點領域。 循環經濟這個名詞在近五年期間不斷的被媒體報導,也有不少產業宣稱自己正在實踐循環經濟。 但循環經濟要怎樣實踐 ? 究竟有那些要點? 其實是一個很值得被仔細了解的系統觀。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
Thumbnail
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
Thumbnail
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
Thumbnail
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
Thumbnail
題目會給定我們一個陣列和參數k,要求我們將陣列右旋k次,然後輸出內容。 例如[1,2,3,4,5] 右旋 2次,輸出就是[4,5,1,2,3]
Thumbnail
在Laravel collection sortBy之後發現原本的array格式在資料回傳後居然變成json格式,以下依序描述問題與解法: 有一包data如下: $data = collect($data); 現在sortBy show_order欄位後,結果如下: $data = collect
Thumbnail
之前跳過的題目,回來補完成。 Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4]
Thumbnail
比今天的題目示例如下: Input: nums = [-4,-1,0,3,10] Output: [0,1,9,16,100] 簡單來說,要的輸出結果是把陣列內每個數字取平方後,對陣列做排序。
Thumbnail
近年我國政府大力的倡議 5+2領域的重點產業轉型,其中循環經濟是一個核心的重點領域。 循環經濟這個名詞在近五年期間不斷的被媒體報導,也有不少產業宣稱自己正在實踐循環經濟。 但循環經濟要怎樣實踐 ? 究竟有那些要點? 其實是一個很值得被仔細了解的系統觀。