如果我有一个适合32位的int,那么在python中将它分成四个8位值的最快方法是什么?我的简单时序测试表明,位掩码和移位速度比中等速度快divmod(),但我很确定我没有考虑过所有内容.
>>> timeit.timeit("x=15774114513484005952; y1, x =divmod(x, 256);y2,x = divmod(x, 256); y3, y4 = divmod(x, 256)")
0.5113952939864248
>>> timeit.timeit("x=15774114513484005952; y1=x&255; x >>= 8;y2=x&255; x>>=8; y3=x&255; y4= x>>8")
0.41230630996869877
Run Code Online (Sandbox Code Playgroud)
在你问之前:这个操作会被大量使用.我正在使用python 3.4.
如果你正在做很多事情,最快的方法是创建专门的专用Struct实例并预绑定pack方法:
# Done once
int_to_four_bytes = struct.Struct('<I').pack
# Done many times (you need to mask here, because your number is >32 bits)
y1, y2, y3, y4 = int_to_four_bytes(x & 0xFFFFFFFF)
Run Code Online (Sandbox Code Playgroud)
struct.pack直接使用会Struct在第一次使用后使用缓存对象,但是您每次都要支付缓存查找成本从格式字符串到缓存Struct,这是次优的.通过创建和预绑定的pack一个的Struct对象(这是关于C中CPython的实现),你绕过所有的Python执行字节码超出了实际的函数调用,而无需费时高速缓存查找.在我的机器上,它运行大约205 ns,而移位和掩码运行267 ns(没有重新分配x).
另一种方法(对于更一般的,不struct兼容的尺寸)正在使用int.to_bytes; 例如,在这种情况下:
y1, y2, y3, y4 = (x & 0xFFFFFFFF).to_bytes(4, 'big')
Run Code Online (Sandbox Code Playgroud)
这需要与手动移位和屏蔽方法大约相同的时间(每个环路需要268 ns),但可以更好地扩展到更大的字节数.
| 归档时间: |
|
| 查看次数: |
4660 次 |
| 最近记录: |