如何快速将大量数据转换为字符串?



假设我有以下类:

import numpy as np
class ToStringify():
DEMARCATION = "::::"
def __init__(self):
self.first_np_array = np.random.rand(30, 30, 30)
self.second_np_array = np.random.rand(30, 30, 30)
self.some_string = "string"
self.some_int = 5
def to_str_format(self) -> str:
entries = [
self.first_np_array, self.second_np_array, self.some_string, self.some_int
]
return f"{self.DEMARCATION}".join([str(entry) for entry in entries])

我已经分析了我的代码,to_str_format占用了我总程序运行时间的25%。不幸的是,to_str_format需要输出一个字符串(无论我选择什么划分),该字符串将在一些我无法更改的管道中进一步消耗。我正在做一个列表理解,试图加快速度,但除此之外,我不确定我还能做什么(如果有的话)。如果这改变了什么,我将使用python 3.9

您必须再次进行配置以验证这些建议是否有足够大的影响,但是快速的非正式测试显示可能有10-15%的改进,所以它可能是有帮助的。

首先,:

join([str(entry) for entry in entries])

不需要[]join()可以使用生成器表达式,因此列表推导只是增加了创建(可能很大的)对象的开销。所以:

join(str(entry) for entry in entries)

可能快一点(似乎约5%)。比这更快(约10%)的是:

join(map(str, entries))

第二个是f字符串。如果您根本不修改或改变DEMARCATION的表示,这就足够了:

self.DEMARCATION.join(....)

避免了处理f字符串的开销。总之,这可能是最有效的形式:

return self.DEMARCATION.join(map(str, entries))

一个额外的事情是entries列表。如果to_str_format()被多次调用,如果entries永远不会改变(也就是说,它总是那4个对象的列表),那么最好在其他地方设置一次(例如实例或类属性)。将其创建为元组比创建为列表可能会稍微快一些。

最新更新