下面这个是本人写的源码,刚学python不久,请见谅.欢迎大侠指点.
下面代码中黑体字的那两层loop循环,xres是240,yres是320,循环中间实际上就是从二进制文件中读取数据,处理一下,再写入一个文件里面.
但是这样的代码,运行起来速度难以接受,居然需要二十秒左右的时间,这个代码是在arm上运行的,cpu时钟是312M.同样差不多的c代码,1s之内
就能搞定,这难道就是传说中的python的性能问题吗?谢谢各位了.
#!/sdcard/Documents/sdcard/python2.5.2/bin/python2.5
import os,fcntl
from ctypes import *
from mmap import mmap,PROT_READ,PROT_WRITE,MAP_SHARED
from struct import unpack,pack
from array import array
class _fb_bitfield(Structure):
_fields_=[ ('offset', c_ulong),
('length', c_ulong),
('msb_right', c_ulong) ]
class _fb_var_screeninfo(Structure):
_fields_=[ ('xres', c_ulong), #visible resolution
('yres', c_ulong),
('xres_virtual', c_ulong),
('yres_virtual', c_ulong),
('xoffset', c_ulong),
('yoffset', c_ulong),
('bits_per_pixel', c_ulong),
('grayscale', c_ulong),
('red', _fb_bitfield),
('green', _fb_bitfield),
('blue', _fb_bitfield),
('transp', _fb_bitfield),
('nonstd', c_ulong),
('activate', c_ulong),
('height', c_ulong),
('weight', c_ulong),
('accel_flags', c_ulong),
('pixclock', c_ulong)
]
class _fb_fix_screeninfo(Structure):
_fields_=[ ('id[0]', c_char), ('id[1]', c_char),('id[2]', c_char),('id[3]', c_char),
('id[4]', c_char),('id[5]', c_char),('id[6]', c_char),('id[7]', c_char),
('id[8]', c_char),('id[9]', c_char),('id[10]', c_char),('id[11]', c_char),
('id[12]', c_char),('id[13]', c_char),('id[14]', c_char),('id[15]', c_char),
('smem_start', c_ulong),
('smem_len', c_ulong)
]
ioctl_name={'FBIOGET_VSCREENINFO':0x4600,
'FBIOGET_FSCREENINFO':0x4602}
bmp_header=array('B',[0x42, 0x4D, 0x36, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x84, 0x03, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
class fb0_func():
def __init__(self):
fd=os.open('/dev/fb0',os.O_RDWR)
var=_fb_var_screeninfo()
err=fcntl.ioctl(fd,ioctl_name['FBIOGET_VSCREENINFO'],var,1)
fix=_fb_fix_screeninfo()
err=fcntl.ioctl(fd,ioctl_name['FBIOGET_FSCREENINFO'],fix,1)
os.close(fd)
self.xres=var.xres
self.yres=var.yres
self.smem_len=fix.smem_len
#print "xres:%d" % self.xres
#print "yres:%d" % self.yres
#print "smem_len:%d" % self.smem_len
def dump(self):
fd=os.open('/dev/fb0',os.O_RDWR)
map=mmap(fd, self.smem_len,MAP_SHARED,PROT_READ | PROT_WRITE)
fd_dumpfb0=open('fb0.dat','wb+')
fd_dumpfb0.write(map)
fd_dumpfb0.close()
os.close(fd)
def snap(self):
fd=os.open('/dev/fb0',os.O_RDWR)
fd_snapfb0=open('fb0.bmp','wb+')
#write bmp header
fd_snapfb0.write(bmp_header)
#write RGB data
map=mmap(fd, self.smem_len,MAP_SHARED,PROT_READ | PROT_WRITE)
xres=self.xres
yres=self.yres
for x in range(1,xres):
for y in range(1,yres):
#pp=2*(x+y*xres)
data=map.read(2)
s1,s2=unpack('2B',data[:])
#print "%s %s" % (hex(s1),hex(s2))
r = ((s1&0x1f) << 3);
g = ((s2&0x7) << 5) | ((s1&0xe0) >> 3);
b = ((s2&0xf );
#print "%d %d %d" % (r,g,b)
bmpdata=pack("3B",r,g,b)
fd_snapfb0.write(bmpdata)
fd_snapfb0.close()
os.close(fd)
def profile_test():
a=fb0_func()
a.dump()
a.snap()
if __name__ == "__main__":
import profile
profile.run("profile_test()"
#profile_test() |