for循环的效率问题,大侠帮忙看看

for循环的效率问题,大侠帮忙看看

下面这个是本人写的源码,刚学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()
这样的代码有用python写的必要吗?
呃。。。
那里面好像就是做了个mmap和一个ioctl,你所说的有没有必要的问题是说的那个for的实现还是代码本身,我的初衷也只是用python做linux上面的测试程序,图它不用编译和语法简单,呵呵
昨天没看完你的代码,原来你用了profile....
那玩意指数级的拖慢程序阿
mmap不熟,不过这东西是否有buffer?如果没有的话,是不是一次多读些数据,比如说1024,而不是2。频繁io会很慢的。仅供参考。
谢谢各位
那个profile是因为慢才加上去的,呵呵,我把数据保存起来放在一个文件里面,然后用for循环操作,去掉profile也是很慢。
可能和我用的是cpu只有312M有关,但是c语言跑在312M上速度也很快的阿
怎么能拿这种脚本语言和 C 比效率