將數字列表中的元素轉換為字元的最快方法是什麼? 這個挑戰是所發現問題的延伸這裡在社區中。 我決定測試八種方法:三種迭代方法(為了,對於每個, 和變換每個)、四種非迭代方法(表格操作、表達式、字+ 表達式,以及正規表示式)和一種混合體(字+變換每個)。 其中五種方法,那些不涉及正規表示式或表達式,在連結的帖子中被考慮。 使用的方法字和正規表示式有點作弊,因為它們利用了字串操作的副作用——具體來說,任何資料結構都可以轉換為字串並進行相應的解析。 我將讓讀者決定他們是否認為這種方法合法。 我知道有些人會對此皺眉!
使用空間填充設計,我研究了四個因素:列表數量、列表元素數量、列表元素數量是否相等或不相等,以及數字類型:整數或浮點數。 設計是在清單清單 – Experimental Runs.JMP 。 原始設計產生的小數值已四捨五入。 每次運行進行十次重複。 我用於運行實驗的程式碼位於運行列表列表實驗.JSL和結果列表結果列表.JMP。 初步運作使用正規表示式速度非常慢,因此被排除在考慮之外。
為了比較方法,我透過運行和複製計算每種方法的排名順序,以及實驗運行中所有複製的運行時間和中位數運行時間之間的差異。 越小越好。 下圖表明變換每個、表操作以及字方法優越。 雖然實際時間差異很小(值以微秒為單位),但這些方法的排名始終較高且變異性較小。


為了看看這四種方法之間是否存在差異,我用更大的清單重新進行了實驗(大列表列表 – Experimental Runs.JMP和列出大結果的列表.JMP )。 查看與運行中中位數時間的時間差異,似乎隨著項目總數的增加,變換每個和表操作表現最好。 這是一個幸運的結果,因為變換每個才剛被引入JMP 16 ,表操作為仍在使用 JMP 15 的人提供了一個很好的解決方案。

對於第二個挑戰,我要求你轉置清單清單。 清單的轉置清單將輸入清單中的所有第一個元素收集到第一個輸出清單中,2 ND輸入元素到2 ND輸出列表等。如果輸入有n列出然後每個輸出列表將有n元素。 輸出列表的數量將等於每個列表中項目數量的最大值。 雖然輸入清單的數量很容易確定,但輸出清單的數量需要計算每個輸入清單中的項目。 有這個必要嗎? 它會導致更快的過程嗎?
為了回答這個問題並測試具體方法,我進行了另一個空間填充設計。 在其中,我研究了三種迭代方法(為了,對於每個, 和變換每個)每種方法都使用兩種方法:一種在建立輸出之前計算輸出列表的數量,需要對輸入進行兩次循環,另一種使用對輸入的單一循環來建立輸出。 此外,我還研究了表格操作的使用。 考慮了六種不同的列表元素類型(整數、浮點、1 個字元、8 個字元、15 個字元和可變寬度字元(最大長度 15)以及固定和可變(內部)列表長度。
在我最初的編碼過程中,我發現從空列表開始並使用建置輸出列表會更快插入而不是使用以下方法預先填入缺失值的輸出重複或表達式。 您可以使用以下程式碼預先建置或插入.JSL親自檢查一下。 第二個發現與變換每個和對於每個。 如果您不熟悉這些函數,它們的行為與您的標準略有不同為了或者儘管循環,因為它們允許您迭代列表、矩陣或關聯數組,而無需指定它們的大小。 這可以使程式碼更加緊湊和乾淨。 對這兩個函數的基本呼叫的結構是
fn名稱({索引值,工業},容器,身體)
在哪裡fn名稱是對於每個或者變換每個,索引值是索引處容器的值工業,容器是矩陣、列表或關聯數組,並且身體是程式碼的主體。 使用大型容器時必須小心。 使用大型資料結構作為容器或者索引值將大大減慢執行速度。 中給了一個例子使用 For Each 和 Transform Each.JSL 。 在其中,我們計算列表列表中每個列表中的項目數。 前兩個程式碼區塊對應於您可能期望如何編碼問題,第一個使用每個子清單作為輸入值,第二個為子清單建立索引。 將此與索引的第三個區塊進行比較一個列表在循環中明確建立和使用。 取決於尺寸一個列表,處理速度可以提高 100 倍或更好。 甚至更快的是變換每個,允許它傳回結果值。 區塊 4 和 5 顯示輸出資料結構將與用於輸入容器的資料結構相同。 有一個可選的輸出()控制輸出資料結構類型的參數。
測試不同轉置方法的程式碼位於轉置列表.JSL 。 如上所述,使用空間填充設計來比較不同條件下的輸出。 與上面的程式碼不同,每次重複都會建立一個新的資料結構。 前三種方法讀取輸入並在單一區塊中建立輸出。 接下來的三個在處理輸入之前首先預先確定輸出清單的大小。 倒數第二個方法使用表格操作,最後一個 Transform Each 方法使用其輸出值進行結構化。

事實證明,預先確定輸出清單的大小比嘗試在單一區塊中執行此操作更快。 的不同實現變換每個顯示透過使用其輸出值所獲得的速度改進。 結果在轉置結果.JMP 。 較大列表比較的實驗對於每個,變換每個(2 ND實現),表操作可以在轉置結果 big.JMP 。 結果表明,表操作總體上優於其他兩種方法。

回顧一下我們的發現:
- 浪費時光:變換每個<對於每個<為了
- 如果不涉及列公式,表操作可以非常快。 在先前的文章中,我們看到,根據其複雜性,列公式可以將操作減慢到迭代或表達式有利的程度。
我沒有得到過去遇到的這個挑戰的典型回饋,所以我確信有更好的方法。 我很想聽聽您的意見。 下個月尋找新的挑戰。