2011-08-12 8 views
1

浮動小数点数のリストを取得し、小数点以下4桁の正確な浮動小数点数を返す関数があります。リスト内のすべての浮動小数点数をstr型の丸め浮動小数点数に置き換える

は現在、それは単に仕事をしていません

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

です。

しかし、(http://wiki.python.org/moin/PythonSpeed/PerformanceTipsは、マップを使用して高速であると言うので)私は、このマップ機能を使用して行うことができ

私は数千回この関数を呼び出し、プロファイルから、それはより多くの時間を要する機能の一つである結果。

+0

私の場合、アルゴリズムの問​​題があります。実行中にリスト**浮動小数点**が変更されていない場合は、その値を1回だけ変更する必要があります。しかし、私はそう思う(そして望む)と思うので、実行中の** float **の変更のリストを締結する。各変更時にリストが完全に変更された場合(=すべての値またはその大多数)、リストの処理はすでに行っているようにすべての値に関係している必要があります。特定の値だけが変化している場合は、必要なときではなく、変更された瞬間に治療を行うのが面白いかもしれません。あなたのケースは何ですか? – eyquem

+0

すべての値が浮動小数点数に変更されます。リストの元の値はすべて整数または浮動小数点数になります。私はリストを渡すときにそれらが変更されるので、私はそれらを取得するときに浮動小数点になることを知っている。 – MxyL

答えて

4

mapは、組み込み関数を使用する場合(または少なくともそれを一度読んでいたときはもっと速いです))。あなたはしかし、リストの内包表記を使用することができます。

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

forループはしません一方mapとリスト内包表記は、新しいリストを作成すること。これは関連するかもしれません。

アプリケーションの残りの部分によっては、可能であれば、番号をリストに追加するときにフォーマットする必要があります。

+0

[この質問](http://stackoverflow.com/q/1247486/115845)は、 'map'対list comprehensionのパフォーマンスについて議論します。要約すると、 'map'は、ad-hoc関数を作成するために' lambda 'が必要でないとき、リスト内包よりも部分的に高速です。 –

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

私はあなたのコメントをサポートしています。説明のないダウンワードは、欲求不満なローファーの練習です。 – eyquem

+0

@eyquemを理解していただきありがとうございます。説明なしでdownvotingすることで、私や他の誰にも教えられません。 –

2

[OK]を、ベースラインを:

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])を使用すると、1ループあたり54ミリ秒です。 rangeの代わりにxrangeを使用した場合も同様です。

いくつか他の人によって提案された次の改善は、リストの内包表記を使用することです(少なくとも私には)驚くべきことに

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は既に、リスト内包は組み込み関数を使うときだけ速くなると述べています。

これをもっと速くする方法は他にありませんので、メモリの使用状況がわかりやすい場合は、リストの理解度を使用してください。

+0

私は 'format =" {0:5.4f} "。format'と' floats = map(format、floats) 'もテストしました。これは古い文字列の書式設定とリストの理解より50%遅かったです。 – agf

関連する問題