Sco*_*ths 6 python optimization idioms
对于像这样的情况,是否存在避免无意义切片复制的常用习惯用法:
>>> a = bytearray(b'hello')
>>> b = bytearray(b'goodbye, cruel world.')
>>> a.extend(b[14:20])
>>> a
bytearray(b'hello world')
Run Code Online (Sandbox Code Playgroud)
在我看来,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
Run Code Online (Sandbox Code Playgroud)
但很多,就像extend在我的第一个例子中,没有这个功能.
我意识到,对于许多应用程序而言,我所说的将是微优化,所以在任何人问之前 - 是的,我已经描述了我的应用程序,这对我的案例来说值得担心.
我在下面有一个"解决方案",但欢迎任何更好的想法.
创建buffer对象可以避免复制切片,但对于短切片,只需进行复制即可:
>>> a.extend(buffer(b, 14, 6))
>>> a
bytearray(b'hello world')
Run Code Online (Sandbox Code Playgroud)
这里只有一个由内存组成的副本,但创建buffer对象的成本超过了节省的成本.不过对于较大的切片应该更好.我不确定这个方法的整体效率会有多大.
请注意,对于Python 3(以及可选的Python 2.7),您需要一个memoryview对象:
>>> a.extend(memoryview(b)[14:20])
Run Code Online (Sandbox Code Playgroud)