此代碼重新排列534x713 RGBA4紋理中的位。爲什麼Cython中這個循環太慢了?
cpdef bytes toDDSrgba4(bytearray data):
cdef bytes new_data = b''
cdef int pixel
cdef int red
cdef int green
cdef int blue
cdef int alpha
cdef int new_pixel
cdef int i
for i in range(len(data) // 2):
pixel = int.from_bytes(data[2*i:2*i+2], "big")
red = (pixel >> 12) & 0xF
green = (pixel >> 8) & 0xF
blue = (pixel >> 4) & 0xF
alpha = pixel & 0xF
new_pixel = (red << 8) | (green << 4) | blue | (alpha << 12)
new_data += (new_pixel).to_bytes(2, "big")
return new_data
它一樣快,因爲它是Python的等價物,它是這樣的:
def toDDSrgba4(data):
new_data = b''
for i in range(len(data) // 2):
pixel = int.from_bytes(data[2*i:2*i+2], "big")
red = (pixel >> 12) & 0xF
green = (pixel >> 8) & 0xF
blue = (pixel >> 4) & 0xF
alpha = pixel & 0xF
new_pixel = (red << 8) | (green << 4) | blue | (alpha << 12)
new_data += (new_pixel).to_bytes(2, "big")
return new_data
他們兩人都是很慢。
我已經寫了非常複雜的調酒甚至不是最優化和測試了這種質地的代碼,它仍然waaay比這更快。
也許把所有'新數據'放到一個列表中,而不是在每一步中連接它,然後在最後加入它。 – khelwood
好的,我會試試。 – AboodXD