gpt4 book ai didi

python - 避免在 Python 中进行不必要的切片复制

转载 作者:太空狗 更新时间:2023-10-29 23:56:16 24 4
gpt4 key购买 nike

在这种情况下是否有避免无意义的切片复制的常用习惯用法:

>>> a = bytearray(b'hello')
>>> b = bytearray(b'goodbye, cruel world.')
>>> a.extend(b[14:20])
>>> a
bytearray(b'hello world')

在我看来,创建 b[14:20] 切片时发生了不必要的复制。与其在内存中创建一个新的切片以提供给 extend,不如说“仅使用当前对象的这个范围”。

有些方法可以帮助您处理切片参数,例如 count:

>>> a = bytearray(1000000)       # a million zero bytes
>>> a[0:900000].count(b'\x00') # expensive temporary slice
900000
>>> a.count(b'\x00', 0, 900000) # helpful start and end parameters
900000

但是很多,比如我第一个例子中的extend,没有这个特性。

我意识到对于许多应用程序,我所说的都是微优化,所以在任何人问之前 - 是的,我已经分析了我的应用程序,这对我的情况来说是值得担心的事情。

我在下面有一个“解决方案”,但欢迎提出更好的想法。

最佳答案

创建一个 buffer 对象可以避免复制切片,但对于短切片,只进行复制会更有效:

>>> a.extend(buffer(b, 14, 6))
>>> a
bytearray(b'hello world')

此处只有一份内存副本,但创建 buffer 对象的成本超过了节省的空间。不过,对于较大的切片应该更好。我不确定要使这种方法整体更有效,切片必须有多大。

请注意,对于 Python 3(以及可选的 Python 2.7),您需要一个 memoryview 对象:

>>> a.extend(memoryview(b)[14:20])

关于python - 避免在 Python 中进行不必要的切片复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2328171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com