2011-02-23 51 views
2

我正在求解一個數字近似值(兩個平方根),精度高達百萬或更多位數。 由於我認爲知識不足,我可以提高效率。但我確實擁有與Python本身的一些問題這可能有助於減少一些開銷倍....在Python中追加和打印數字列表

  1. 如果我們做一個計算,這將持續幾個小時,我怎麼一個常數因子的多少可以減少通過在while循環外部移動一次性條件語句(IT將僅用於任何一個通道)?它只是n *常數因子C?

  2. 根據一些讀數,我被告知list.append(x)代價高昂。在while循環中,每次迭代都會在列表中追加一個新的整數(我也必須先str(x)...)。 高清method6():

    回報'。加入([num爲NUM在x範圍(loop_count)])

參考閱讀:Efficient String Concatenation in Python

我感興趣的這個方法。我可以用它來建立列表,並且當我從函數返回時(即,我需要輸出結果),將列表中的每個項目都加入到單一字符串中。我不太確定如何使用這種方法。第一個數字是什麼? (請訪問鏈接,因爲計算器去除第一NUM的報價)與#2跟進

  1. ,我將整數進榜

    打印結果

    [1L,'。',4L,1L,4L,2L,1L]

    打印結果[0]

我不記得是什麼字母L代表.....

我明白任何幫助!非常感謝你。

+0

L代表長。你應該預先分配你的列表,例如'200000 * [0L]' – Anycorn 2011-02-23 01:09:19

+0

如果我想打印一百萬位數字,我應該預先分配一百萬* [0L]嗎?我看到了預分配的優勢。我認爲它消除了爲每次迭代計算索引,分配內存等的消息。 – CppLearner 2011-02-23 01:12:13

+0

'(10 ** 6)* [0L]' – Anycorn 2011-02-23 01:15:24

回答

4

(請儘量限制問題,一個主題,而不是要求幾個不相關的問題,在一次)。

如果你想知道有多少的差異的變化如移動出來的東西的一個循環,使你需要自己進行基準測試。搜索timeit

追加到一個字符串和一個列表是完全不同的野獸。

字符串是不可變的 - 你不會追加到它們。 a += 'x'不會將'x'附加到a;它會創建一個全新的字符串,使其成爲O(n)。當追加很多字符串時,這可能是低效率的,因爲它變成O(n^2)。(但是請注意,當有對a沒有其他參考CPython的優化這種特殊情況下,消除了額外的複製不是所有的Python實現可以做到這一點。)

這個問題不會存在列表:list是可變的。追加到列表中的是O(1),因此可以高效地將它們附加到循環中。 (它會定期重新分配列表以騰出空間存放新項目,但效率很高。)

如果要生成大量要插入列表的數據,通常最好使用生成器函數,但你不需要。

在Python 2中,1L聲明瞭long而不是int;見http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex

+0

感謝您的回覆。它真的很有幫助。 – CppLearner 2011-02-23 19:12:18

1

追加到列表並不昂貴。追加到字符串是昂貴的。

這是因爲Python中的字符串是不可變的,所以每次追加時都會創建一個全新的字符串。但是,列表是可變的,因此追加到列表最後只需添加一個項目。

列出的大多數Python實現的後盾實現是數組,這樣隨時間增長需要加以如果初始化爲更小的尺寸重新分配了幾次,但由於大多數的實現傾向於使用指數列表對於分配大小來說,增長因子並不是什麼大問題(如果你願意的話,你可以通過my_list = [None]*1000000之類的預先分配全部長度的方式來避免這種情況),以獲得一百萬None的列表。

+0

謝謝。琥珀色。謝謝您的幫助。很有幫助! – CppLearner 2011-02-23 19:12:35