今天尝试实现一个自带时间戳的str,需要 override += 操作符。
最初的实现:
def __iadd__(self, other):
self.__timestamps__.append((len(self), datetime.datetime.now()))
string = str(self)
string += other
return TimestampedStr.__scopy__(self.__timestamps__, string)
经过自己测试发现性能非常慢,消耗时间是原生str的100倍左右,进一步研究发现 Python 在 str 引用数为 1 的时候,确认其他对象不再使用之前的 str 的话会不销毁之前的 str 对象,直接在“原地”进行 resize ,提高性能。在 Cpython/Objects/bytesobject.c PyBytes_Concat 函数中有这行判断语句。
if (Py_REFCNT(*pv) == 1 && PyBytes_CheckExact(*pv))
其中 pv 是应该是指向实际存放字符内容的缓存,并不是Python str Object,