比较:4字节bytearray转化为int

Jacky <jacky.chao.wang@gmail.com>
to      "python-cn`CPyUG`华蟒用户组(中文Py用户组)" <python-cn@googlegroups.com>
cc      wileishn@gmail.com,
zoom.quiet@gmail.com
date    Mon, Aug 16, 2010 at 22:10
subject 方案比较:快速将4字节bytearray转化为int

代码

Toggle line numbers
   1 import struct
   2 import ctypes
   3 
   4 def test_struct(buf, offset):
   5     return struct.unpack_from("I", buf, offset)[0]
   6 
   7 def test_ctypes(buf, offset):
   8     return ctypes.c_uint32.from_buffer(buf, offset).value
   9 
  10 def test_multi(buf, offset):
  11     return buf[offset] + (buf[offset+1] << 8) + (buf[offset+2] << 16) +(buf[offset+3] << 24)
  12 
  13 buf_w = bytearray(5)
  14 buf_w[1] = 1
  15 buf_r = buffer(buf_w)
  16 
  17 if __name__ == '__main__':
  18     import timeit
  19     t1 = timeit.Timer("test_struct(buf_r, 1)",
  20                    "from __main__ import test_struct, buf_r")
  21     t2 = timeit.Timer("test_ctypes(buf_w, 1)",
  22                    "from __main__ import test_ctypes, buf_w")
  23     t3 = timeit.Timer("test_multi(buf_w, 1)",
  24                    "from __main__ import test_multi, buf_w")
  25     print t1.timeit(number=1000)
  26     print t2.timeit(number=1000)
  27     print t3.timeit(number=1000)

结果

number = 10000
0.0081958770752
0.012549161911
0.0112121105194

number = 1000
0.00087308883667
0.00125789642334
0.00110197067261

number = 100
0.0000917911529541     # 9.17911529541e-05
0.000133991241455
0.00011420249939

number = 10
1.69277191162e-05
2.19345092773e-05
1.69277191162e-05

number = 1
1.00135803223e-05
1.00135803223e-05
5.96046447754e-06

为什么运行次数不同,结果也有差异呢?


反馈

创建 by -- ZoomQuiet [2010-08-17 03:44:33]

MiscItems/2010-08-17 (last edited 2010-08-17 03:44:46 by ZoomQuiet)