假设我有以下类:
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个对象的列表),那么最好在其他地方设置一次(例如实例或类属性)。将其创建为元组比创建为列表可能会稍微快一些。