最近我發現我的學生在做什麼,他用非常大串(2-4MB)作爲在字典中值的獨立項目。如何最好地在Python中存儲大量文本序列?
我從來沒有過的原因與文本的這種大塊工作,它讓我知道是否有創建這樣的大字符串相關的性能問題。
是否有這樣做比簡單地創建一個字符串的更好的辦法?我意識到這個問題很大程度上取決於上下文,但我正在尋找可能涵蓋多個可能的用例的廣義答案。
如果你有這麼大的文字工作,你會如何將其存儲在你的代碼,你會做什麼比如果你簡單地用只有幾個字符普通字符串的工作有什麼不同?
最近我發現我的學生在做什麼,他用非常大串(2-4MB)作爲在字典中值的獨立項目。如何最好地在Python中存儲大量文本序列?
我從來沒有過的原因與文本的這種大塊工作,它讓我知道是否有創建這樣的大字符串相關的性能問題。
是否有這樣做比簡單地創建一個字符串的更好的辦法?我意識到這個問題很大程度上取決於上下文,但我正在尋找可能涵蓋多個可能的用例的廣義答案。
如果你有這麼大的文字工作,你會如何將其存儲在你的代碼,你會做什麼比如果你簡單地用只有幾個字符普通字符串的工作有什麼不同?
這很大程度上取決於您對字符串做了什麼。我不太確定Python是如何存儲字符串的,但是我在XEmacs(類似於GNU Emacs)以及Emacs Lisp(它是Python這樣的動態語言)的底層實現方面做了很多工作,並且我知道字符串是如何在那裏實施。字符串將被存儲爲與數組類似的內存塊。在Python中創建大型數組沒有太大的問題,所以我不認爲只是以這種方式存儲字符串會導致性能問題。有些事情要考慮,但:
你是如何建立的字符串?如果您通過簡單地追加到更大的字符串來逐個構建,則會有O(N^2)算法非常慢。 Java用StringBuilder
類處理這個問題。我不確定在Python中是否有確切的等價物,但是您可以簡單地創建一個包含想要連接在一起的所有部分的數組,然後使用''.join(array)
在最後加入。
你需要搜索的字符串?這與創建字符串無關,但需要考慮。一般而言,搜索將是字符串大小的O(n);有加速使其成爲O(n/m),其中m是您正在搜索的子字符串的大小,但就是這樣。這裏主要考慮是否存儲一個大字符串或一系列子字符串。如果你需要搜索所有的子字符串,這對於搜索一個大字符串沒有太大的幫助,但是你可能會事先知道某些部分不需要被搜索。
你需要訪問子?再次,這與創建字符串無關,需要考慮。按位置訪問子字符串只是索引到正確的內存位置的問題,但如果您需要採用大的子字符串,則效率可能很低,並且您可以通過將字符串存儲爲子字符串數組來加快速度,然後創建一個新的字符串作爲另一個數組與一些字符串共享。但是,這樣做需要工作,除非真的有必要,否則不應該這樣做。
總之,我認爲簡單的情況下,它的優良有大串這樣的,但你應該想想各種各樣你要執行的操作,以及他們的O(...)時間。
我要說的是潛在的問題取決於兩件事情:
怎麼樣的許多字符串都保留在內存中的同時,相比內存(RAM中)的能力?
對這些字符串所做的操作是什麼?
在我看來,我已經讀過Python中對字符串的操作是非常有效的,所以它不應該在很長的字符串上工作。但實際上它取決於每個操作在大字符串上執行的算法。
這個答案比較模糊,我沒有足夠的經驗去做出更有用的問題估計。但問題也非常廣泛。
字符串/字典值用於什麼?他們是否被搜查?有一堆嗎? – dawg
他們可能被搜查,可能有一堆他們。我一般都在談論---如果你根據這些問題選擇不同的話,那麼在你的回答中肯定會這樣說。 – Aerovistae
伊莫這個問題沒有答案,只是關於上下文。我將其標記爲「太寬泛」 –