2013-08-29 98 views
5

在下面鏈接的文章,筆者在蟒蛇不同的字符串連接方法的效率比較: ,我不明白http://www.skymind.com/~ocrow/python_string/爲什麼列表快於字符串連接字符數組

的一件事是,爲什麼法3(可變字符數組)導致性能明顯低於方法4(加入字符串列表)

兩者都是可變的,我認爲它們應該具有可比較的性能。

+0

推測'array.fromstring'沒有像'str.join'那樣優化。 – abarnert

+3

另外,請注意,這篇文章是從2004年開始的。在較新版本的Python中,Naive str追加速度要快得多,'str.join'也是如此...... – abarnert

+0

@abarnert說的是完全相關的。在寫這篇文章時,Python的最新版本是2.3.3(見http://www.python.org/download/releases/和http://www.python.org/download/releases/2.3.4/) )。當時所做的基準在今天基本上毫無意義。 –

回答

4

「它們都是可變的」會誤導你一下。

確實,在列表追加方法中,列表是可變的。但建立清單並不是緩慢的部分。如果您有1000個平均長度爲1000的字符串,那麼您將對該陣列執行1000000個突變,但對列表只有1000個突變(對字符串對象加上1000個突變)。

特別是,這意味着array將花費1000倍的時間擴展(分配新的存儲和複製到目前爲止的整個事情)。

列表方法的緩慢部分是末尾的str.join調用。但那不是可變的,並且不需要任何擴展。它使用兩遍,首先計算所需的大小,然後將所有內容複製到它。

此外,str.join中的代碼已經(並且自從那篇文章寫於9年前以來一直存在)大量的工作來優化它,因爲這是一個非常常見和推薦的成語,許多真實的程序依賴於每天;自從第一次加入該語言以來,它幾乎沒有被觸及過。

但是,如果您真的想了解這些差異,則必須查看來源。在2.7中,數組方法的主要工作是array_fromstring,而列表方法的主要工作是string_join。你可以看到後者如何利用這樣的事實,即我們已經知道我們將在開始時加入的所有字符串,而前者不能。

+0

「它使用兩遍,首先計算所需的大小,然後複製所有內容。」 - 真的?這是我沒有意識到的特定於列表的優化嗎?它不能用於一般的迭代。 – user2357112

+0

嗯,如果它不是一個元組或列表,它會從輸入中創建一個元組。 – user2357112

+1

您的'bytes_join'鏈接已損壞。試試['string_join'](http://hg.python.org/cpython/file/2.7/Objects/stringobject.c#l1586)。 – user2357112

相關問題