对于这样的情况,是否有一个常见的习惯用法可以避免无意义的切片复制:
>>> 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
object 避免复制切片,但对于短切片,仅进行复制会更有效:
>>> a.extend(buffer(b, 14, 6))
>>> a
bytearray(b'hello world')
这里只有一份内存副本,但创建内存的成本buffer
对象不仅仅是消除了保存。不过,对于较大的切片来说应该更好。我不确定该切片必须有多大才能使该方法整体更有效。
请注意,对于 Python 3(以及可选的 Python 2.7),您需要一个memoryview
对象代替:
>>> a.extend(memoryview(b)[14:20])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)