免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3740 | 回复: 6
打印 上一主题 下一主题

for循环的效率问题,大侠帮忙看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-30 10:15 |只看该作者 |倒序浏览
下面这个是本人写的源码,刚学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()

论坛徽章:
0
2 [报告]
发表于 2008-03-31 00:03 |只看该作者
这样的代码有用python写的必要吗?

论坛徽章:
0
3 [报告]
发表于 2008-03-31 09:09 |只看该作者
呃。。。
那里面好像就是做了个mmap和一个ioctl,你所说的有没有必要的问题是说的那个for的实现还是代码本身,我的初衷也只是用python做linux上面的测试程序,图它不用编译和语法简单,呵呵

论坛徽章:
0
4 [报告]
发表于 2008-03-31 10:46 |只看该作者
昨天没看完你的代码,原来你用了profile....
那玩意指数级的拖慢程序阿

论坛徽章:
0
5 [报告]
发表于 2008-03-31 11:18 |只看该作者
mmap不熟,不过这东西是否有buffer?如果没有的话,是不是一次多读些数据,比如说1024,而不是2。频繁io会很慢的。仅供参考。

论坛徽章:
0
6 [报告]
发表于 2008-03-31 12:04 |只看该作者
谢谢各位
那个profile是因为慢才加上去的,呵呵,我把数据保存起来放在一个文件里面,然后用for循环操作,去掉profile也是很慢。
可能和我用的是cpu只有312M有关,但是c语言跑在312M上速度也很快的阿

论坛徽章:
0
7 [报告]
发表于 2008-04-04 15:41 |只看该作者
怎么能拿这种脚本语言和 C 比效率
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP