我有一个函数,它接受一个浮点数列表并返回相同的浮点数列表,除了它们在小数点后面只有4位数字,作为字符串
目前只是
for i in range(len(floats)): floats[i] = "%.4f" %floats[i]
这项工作是做什么的。
但我可以使用map函数执行此操作(因为http://wiki.python.org/moin/PythonSpeed/PerformanceTips表示使用map更快)
我将这个函数调用了几千次,从配置文件结果来看,它是占用更多时间的函数之一。
答案 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)]