我有一个20字节的字符串,我想将它转换为一个用于位字段操作的ctypes.c_ubyte数组。import ctypes
str_bytes = '01234567890123456789'
byte_arr = bytearray(str_bytes)
raw_bytes = (ctypes.c_ubyte*20)(*(byte_arr))
为了演员,有没有办法避免从str到bytearray的深度复制?
或者,是否可以将字符串转换为bytearray而无需深层副本?(使用像memoryview这样的技术?)
我正在使用Python2.7。
性能结果:
使用eryksun和Brian Larsen的建议,这里是在vbox VM下的基准测试,它有Ubuntu 12.04和Python 2.7。方法1使用我的原始帖子
方法2使用缓冲区副本中的ctype
方法3使用ctype cast/POINTER
方法4使用numpy
结果:方法1需要3.87秒
方法2需要0.42秒
方法3需要1.44秒
方法4需要8.79秒
代码:import ctypes
import time
import numpy
str_bytes = '01234567890123456789'
def method1():
result = ''
t0 = time.clock()
for x in xrange(0,1000000):
byte_arr = bytearray(str_bytes)
result = (ctypes.c_ubyte*20)(*(byte_arr))
t1 = time.clock()
print(t1-t0)
return result
def method2():
result = ''
t0 = time.clock()
for x in xrange(0,1000000):
result = (ctypes.c_ubyte * 20).from_buffer_copy(str_bytes)
t1 = time.clock()
print(t1-t0)
return result
def method3():
result = ''
t0 = time.clock()
for x in xrange(0,1000000):
result = ctypes.cast(str_bytes, ctypes.POINTER(ctypes.c_ubyte * 20))[0]
t1 = time.clock()
print(t1-t0)
return result
def method4():
result = ''
t0 = time.clock()
for x in xrange(0,1000000):
arr = numpy.asarray(str_bytes)
result = arr.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte*len(str_bytes)))
t1 = time.clock()
print(t1-t0)
return result
print(method1())
print(method2())
print(method3())
print(method4())