2011-08-12 20 views
1

我有一個函數,它接受浮點列表並返回相同的浮點列表,除非它們在小數點後有4位數字,如字符串使用python map來替換列表中的所有浮點類型爲str

目前,它僅僅是

 
for i in range(len(floats)): 
    floats[i] = "%.4f" %floats[i] 

哪個做這項工作。

但可以在此使用地圖功能(因爲http://wiki.python.org/moin/PythonSpeed/PerformanceTips說使用的地圖是更快)

我調用這個函數幾千倍,從剖析結果它是,佔用了更多的時間的功能之一我做的。

+0

對我來說有一個算法問題:如果你的列表** float **在執行過程中沒有被修改,你只能改變它的值一次;但我認爲(並希望)情況並非如此,因此我在執行期間總結了列表** float **的變化。如果列表在每次修改時完全改變(=所有值或大部分值),那麼列表的處理必須涉及所有值,就像您已經做的一樣;但是如果只有某些價值觀發生變化,那麼在他們改變的時刻進行治療可能會很有趣,而不是在他們需要的時刻。你的情況是什麼? – eyquem

+0

所有值將更改爲浮動。列表中的所有原始值都將是整數或浮點數。當我通過列表時,它們會發生變化,以便我知道當我檢索它們時它們將會漂浮。 – MxyL

回答

4

map只有更快,如果你使用內置函數(或者至少這是我曾經讀到它;))。你可以使用,雖然列表理解:

pattern = "%.4f" 
floats = [pattern % i for i in floats] 

注意map和列表解析會創建一個新的列表,而for循環不會。這可能是相關的。

根據應用程序的其餘部分,如果可能的話,那麼當您將它們添加到列表格式的數字。

+0

[此問題](http://stackoverflow.com/q/1247486/115845)討論了「map」與列表理解的性能。總而言之,當'lambda'不需要創建臨時函數時,'map'可以比列表理解更快。 –

0

如果你想使用的地圖,則可以使用下面的示例:

map(lambda x: "%.4f" % x, [random() for i in xrange(10)]) 

然而@Felix是正確的,列表解析會更快:

["%.4f" % x for x in [random() for i in xrange(10)]] 

此外,它也不是很清楚並且如果您的列表中不僅可以包含花車並且您希望保留它們,您可以執行以下操作:

["%.4f" % x if isinstance(x, float) else x for x in listValues] 

或者,如果你想離開僅STR彩車則:

["%.4f" % x for x in listValues if isinstance(x, float)] 
+1

?所以 - 我做錯了什麼?在投票期間寫評論真的很難,以幫助人們理解他們的問題嗎?是這樣嗎? –

+1

我支持你的評論。 Downvotes沒有解釋是一個令人沮喪的遊手好閒的練習 – eyquem

+0

感謝您理解@eyquem - downvoting沒有解釋不會教我或任何其他人 - 並絕對沒有用於社區。 –

2

好,基線:

python -m timeit 
    "from random import randint; 
    floats = [randint(0, 1000000)/1000.0 for unused in range(10000)]" 
    "for i in range(len(floats)): 
    floats[i] = '%.4f' % floats[i]" 
10 loops, best of 3: 48.7 msec per loop 

有趣的是,新的風格的字符串格式化是有點慢。使用'{0:5.4f}'.format(floats[i])每循環提供54毫秒。使用xrange代替range時,同樣的情況。

下次改進建議的其他幾個人是使用列表理解:

python -m timeit 
    "from random import randint; 
    floats = [randint(0, 1000000)/1000.0 for unused in range(10000)]" 
    "floats = ['%.4f' % f for f in floats]" 
10 loops, best of 3: 48.1 msec per loop 

令人驚訝的(至少我),這是不是顯著更快!不過,@Felix King已經提到,使用內建函數時,列表解析只會更快。

我真的沒有任何關於如何使這個更快的建議,所以我建議,如果內存使用對你來說是合適的,那就使用列表理解,因爲它更具可讀性,因此更加pythonic。

+0

我還測試了'format =「{0:5.4f}」.format'和'floats = map(format,float)',它比舊的字符串格式化和列表理解速度慢了50%。 – agf

相關問題