免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tianshizhiluan
打印 上一主题 下一主题

请问 "luffy.deng": 如何访问属性(一句话描述不清楚) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-08-26 09:23 |只看该作者
本帖最后由 luffy.deng 于 2010-08-26 09:26 编辑

回复 18# shhgs
回复 20# tianshizhiluan
  
实际上shhgs你的代码还有性能问题,模拟一个嵌套50层,最内层有30000个元素的字典,遍历一次最内层字典你的代码要跑59秒,我的方法只需要13秒。嵌套层数越多,对内层访问越频繁你的办法性能下降越厉害。
(我的机器配置双核2.2GHz,2G内存)

  1. d={'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  2. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  3. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  4. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  5. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  6. {'c':{'c':{'c':{'c':{'a':None,'b':None,'c':None}
  7. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

  8. start=time.time()
  9. n=10000
  10. while n>0:
  11.     foo.c.c.c.c.c.c.c.c.c.c\
  12.        .c.c.c.c.c.c.c.c.c.c\
  13.        .c.c.c.c.c.c.c.c.c.c\
  14.        .c.c.c.c.c.c.c.c.c.c\
  15.        .c.c.c.c.c.c.c.c.c.a
  16.     foo.c.c.c.c.c.c.c.c.c.c\
  17.        .c.c.c.c.c.c.c.c.c.c\
  18.        .c.c.c.c.c.c.c.c.c.c\
  19.        .c.c.c.c.c.c.c.c.c.c\
  20.        .c.c.c.c.c.c.c.c.c.b
  21.     foo.c.c.c.c.c.c.c.c.c.c\
  22.        .c.c.c.c.c.c.c.c.c.c\
  23.        .c.c.c.c.c.c.c.c.c.c\
  24.        .c.c.c.c.c.c.c.c.c.c\
  25.        .c.c.c.c.c.c.c.c.c.c
  26.     n-=1
  27. print time.time()-start
复制代码

论坛徽章:
0
22 [报告]
发表于 2010-08-26 12:19 |只看该作者
本帖最后由 shhgs 于 2010-08-26 12:32 编辑

  1. class dct(object):
  2.     def __init__(self, d):
  3.         self.__d = d
  4.     def __getattr__(self, k):
  5.         try:
  6.             result = self.__d[k]
  7.             if isinstance(result, dict):
  8.                 o = dct(result)
  9.                 setattr(self, k, o)
  10.                 return o
  11.             else:
  12.                 return result
  13.         except:
  14.             raise AttributeError
复制代码

论坛徽章:
0
23 [报告]
发表于 2010-08-26 12:21 |只看该作者
接着,回答你的问题
1. 你所谓的功能,无法是在result的外面加一个 descriptor。
2. 你所谓的性能,无非是递归调用之后加一个setattr


以你的水平,难道也看不懂这两句?

论坛徽章:
0
24 [报告]
发表于 2010-08-26 12:38 |只看该作者

  1. #!/usr/bin/python
  2. import time
  3. import sys
  4. class dct(object):
  5.     def __init__(self, d):
  6.         self.__d = d
  7.     def __getattr__(self, k):
  8.         try:
  9.             result = self.__d[k]
  10.             if isinstance(result, dict):
  11.                 o = dct(result)
  12.                 setattr(self, k, o)
  13.                 return o
  14.             else:
  15.                 return result
  16.         except:
  17.             raise AttributeError

  18. class Meta(type):
  19.     def __getattribute__(self,name):
  20.         _attr=object.__getattribute__(self,name)
  21.         if isinstance(_attr,dict):
  22.             setattr(self,name,Meta('',(object,),_attr))
  23.             _attr=object.__getattribute__(self,name)
  24.         return _attr

  25. d={'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  26. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  27. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  28. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  29. {'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':{'c':
  30. {'c':{'c':{'c':{'c':{'a':None,'b':None,'c':None}
  31. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

  32. if sys.argv[1] == 'shhgs':
  33.     foo = dct(d)
  34. elif sys.argv[1] == 'luff':
  35.     foo = Meta('foo', (object, ), d)
  36. else:
  37.     sys.exit(1)

  38. start=time.time()
  39. n=10000
  40. while n>0:
  41.     foo.c
  42.     foo.c.c.c.c.c.c.c.c.c.c\
  43.        .c.c.c.c.c.c.c.c.c.c\
  44.        .c.c.c.c.c.c.c.c.c.c\
  45.        .c.c.c.c.c.c.c.c.c.c\
  46.        .c.c.c.c.c.c.c.c.c.a
  47.     foo.c.c.c.c.c.c.c.c.c.c\
  48.        .c.c.c.c.c.c.c.c.c.c\
  49.        .c.c.c.c.c.c.c.c.c.c\
  50.        .c.c.c.c.c.c.c.c.c.c\
  51.        .c.c.c.c.c.c.c.c.c.b
  52.     foo.c.c.c.c.c.c.c.c.c.c\
  53.        .c.c.c.c.c.c.c.c.c.c\
  54.        .c.c.c.c.c.c.c.c.c.c\
  55.        .c.c.c.c.c.c.c.c.c.c\
  56.        .c.c.c.c.c.c.c.c.c.c
  57.     n-=1
  58. print time.time()-start

复制代码
  1. $./a.py shhgs
  2. 0.318892002106
  3. $./a.py luff
  4. 7.18495512009
复制代码

论坛徽章:
0
25 [报告]
发表于 2010-08-26 12:38 |只看该作者
回复 21# luffy.deng


你自己看。数量级的性能差距。

论坛徽章:
0
26 [报告]
发表于 2010-08-26 12:42 |只看该作者
本帖最后由 shhgs 于 2010-08-26 12:45 编辑

回复 21# luffy.deng


算了。就不再刺激你了。

论坛徽章:
0
27 [报告]
发表于 2010-08-26 12:45 |只看该作者
回复 26# shhgs

我说的是你原来那个递归写法,改成这样当然没问题了。

论坛徽章:
0
28 [报告]
发表于 2010-08-26 12:47 |只看该作者
看来还是不服气。

那你就继续吧。反正谁都挡不住你写烂代码。

论坛徽章:
0
29 [报告]
发表于 2010-08-26 12:50 |只看该作者
回复 25# shhgs
还是有点问题的比如下边这个字典  foo.__str__是得不到30的。
  1. d={'__str__':30,
  2. 'b':None}

  3. class dct(object):
  4.     def __init__(self, d):
  5.         self.__d = d
  6.     def __getattr__(self, k):
  7.         try:
  8.             result = self.__d[k]
  9.             if isinstance(result, dict):
  10.                 o = dct(result)
  11.                 setattr(self, k, o)
  12.                 return o
  13.             else:
  14.                 return result
  15.         except:
  16.             raise AttributeError

  17. foo = dct(d)
  18. print foo.__str__
复制代码

论坛徽章:
0
30 [报告]
发表于 2010-08-26 12:52 |只看该作者
我原来的递归,现在难道不是还用的递归?

你的写法难道就不是递归?

原先性能差难道是因为递归?

这么些基础概念都搞不清楚。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP