使用python map用str类型的圆形浮点数替换列表中的所有浮点数

时间:2011-08-12 15:51:09

标签: python list optimization

我有一个函数,它接受一个浮点数列表并返回相同的浮点数列表,除了它们在小数点后面只有4位数字,作为字符串

目前只是

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

这项工作是做什么的。

但我可以使用map函数执行此操作(因为http://wiki.python.org/moin/PythonSpeed/PerformanceTips表示使用map更快)

我将这个函数调用了几千次,从配置文件结果来看,它是占用更多时间的函数之一。

3 个答案:

答案 0 :(得分:4)

如果你使用内置函数,

map只会更快(或者至少当我读到它时曾经是这样;))。你可以使用列表理解:

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

请注意,map和列表推导会创建一个新列表,而for循环则不会。这可能是相关的。

根据应用程序的其余部分,如果可能,您应该在将数字添加到列表时格式化数字。

答案 1 :(得分: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。 / p>

答案 2 :(得分: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 floats:

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