Python 缓冲区复制速度 - 为什么数组比字符串慢?

标签 python arrays string performance stdvector

我在 C++ 中有一个继承自 std::vector<char> 的缓冲区对象.我想将此缓冲区转换为 Python 字符串,以便我可以通过 Twisted 的 protocol.transport.write 通过网络将其发送出去。

我想到的两种方法是 (1) 制作一个字符串并逐个字符地填充它:

def scpychar(buf, n):
    s = ''
    for i in xrange(0, n):
        s += buf[i]
    return s

和 (2) 制作一个 char 数组(因为我知道缓冲区有多大),填充它并将其转换为字符串

def scpyarr(buf, n):
    a = array.array('c','0'*n)
    for i in xrange(0, n):
        a[i] = buf[i]
    return a.tostring()

我本以为 (1) 每次都必须创建一个新的字符串对象 s += buf[i]被调用,并复制旧字符串的内容。所以我期待 (2) 比 (1) 更快。但是,如果我使用 timeit 对此进行测试,我发现 (1) 实际上大约是 (2) 的两倍。

我想知道是否有人可以解释为什么 (1) 更快?

以更有效的方式从 std::vector<char> 转换的奖励积分到 Python 字符串。

最佳答案

CPython 有时可以将字符串 += 优化为原地,如果它可以确定没有人保留对旧字符串的引用。算法 (1) 可能会触发优化,因此它不会遭受原本会具有的二次运行时间。但是,无法保证此行为,其他 Python 实现可能不支持它。

尝试

''.join(buf)

它应该在任何 Python 实现上提供线性时间性能,与 (1) 不同,并且比 (2) 更快。

关于Python 缓冲区复制速度 - 为什么数组比字符串慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18219718/

相关文章:

javascript - 从数组中删除字符串

Javascript按小写字符的第一个实例拆分字符串

c套接字revcv接收截断的字符串

python - 如何从基类中获取派生类名

php - Tensorflow 1.5 的非法指令(核心转储)

javascript - 为什么这些数组按值传递而不是按引用传递?

java - 从字符串中提取字符串

c++ - 通过引用 : TypeError: No to_python (by-value) converter found for C++ type: 调用 Boost.Python

python - 导入 pykml.factory 时出现语法错误

arrays - MongoDB 尝试删除数组项时出错