Python 中字符串和 Bytes 的 Resize

今天尝试实现一个自带时间戳的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,

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *