我有一个在Python 3.5上运行的Web服务,它向用户提供一些跟踪消息。跟踪消息以python字符串格式存储在解码器中。每条跟踪都存储一个ID和参数列表。当用户尝试获取跟踪时,我遍历跟踪并使用跟踪消息格式对其进行格式化。
例如:
def message(self, parameters=[]):
if len(parameters) == 0:
return self._message
return self._message.format(*parameters)
参考上面的代码,python中的格式函数非常慢。我已经使用cProfile来分析我的代码并挤压我可以获得的每一个ms,但瓶颈是string.format()
,因为我必须格式化许多消息。只需几秒钟即可提供应该服务的一小部分样本。
所以我的问题是,无论如何要加快速度,事实上我只有很少的字符串格式列表?我的意思是解析相同的格式字符串1000000次然后执行变量替换效率很低。我可以使用string.Formatter类实现某种缓存吗?
只需注意跟踪以string.format()
格式存储和加载,因此使用%
替换格式不是直接选项,即使它使用该格式节省至少一半的时间并节省随着参数数量的增加,甚至更多。
让事情变得更糟的是string.format()
需要线性时间和参数数量!
跟踪消息通常包含一些字符串,其中一些参数需要替换为十进制或十六进制数字,如下所示:
"Some text followed by variable {:0d} , Other variable 0x{:08X}"
我也查看了PEP 3101,看起来字符串格式效率低,因为只要使用相同的字符串调用format,它就会反复解析字符串。我想知道是否有一种优化格式化程序的方法,以便它缓存字符串格式并避免所有解析,如果它之前完成?