比namedtuple更快的选择。
plain_obj的Python项目详细描述
比namedtuple更快的选择。
基本用法
创建
importplain_objConfig=plain_obj.new_type('Config','is_debug, skips_dist, run_tests')config=Config(True,False,True)ifconfig.is_debug:print("This is a verbose debugging message.")
做一个dict
config.as_dict()
何时使用plain_obj而不是namedtuple?
当更快的创建时间对您很重要时。
比较python 2.7中的plain_obj和namedtuple:
In[3]:%timeitcollections.namedtuple('Point',['x','y','z'])1000loops,bestof3:338µsperloopIn[4]:%timeitplain_obj.new_type('Point',['x','y','z'])10000loops,bestof3:97.8µsperloopIn[5]:Point=collections.namedtuple('Point',['x','y','z'])In[6]:NewPoint=plain_obj.new_type('Point',['x','y','z'])In[7]:%timeitPoint(1,2,3)Theslowestruntook7.99timeslongerthanthefastest.Thiscouldmeanthatanintermediateresultisbeingcached.1000000loops,bestof3:507nsperloopIn[8]:%timeitNewPoint(1,2,3)Theslowestruntook6.70timeslongerthanthefastest.Thiscouldmeanthatanintermediateresultisbeingcached.1000000loops,bestof3:462nsperloopIn[9]:p=Point(1,2,3)In[10]:new_p=NewPoint(1,2,3)In[11]:%timeitp.x,p.y,p.zTheslowestruntook9.92timeslongerthanthefastest.Thiscouldmeanthatanintermediateresultisbeingcached.1000000loops,bestof3:408nsperloopIn[12]:%timeitnew_p.x,new_p.y,new_p.zTheslowestruntook11.70timeslongerthanthefastest.Thiscouldmeanthatanintermediateresultisbeingcached.10000000loops,bestof3:163nsperloop
比较python 3.6中的plain_obj和namedtuple:
In[3]:%timeitcollections.namedtuple('Point',['x','y','z'])382µs±3.82µsperloop(mean±std.dev.of7runs,1000loopseach)In[4]:%timeitplain_obj.new_type('Point',['x','y','z'])53.5µs±1.2µsperloop(mean±std.dev.of7runs,10000loopseach)In[5]:Point=collections.namedtuple('Point',['x','y','z'])In[6]:NewPoint=plain_obj.new_type('Point',['x','y','z'])In[7]:%timeitPoint(1,2,3)521ns±2.5nsperloop(mean±std.dev.of7runs,1000000loopseach)In[8]:%timeitNewPoint(1,2,3)438ns±5.53nsperloop(mean±std.dev.of7runs,1000000loopseach)In[9]:p=Point(1,2,3)In[10]:new_p=NewPoint(1,2,3)In[11]:%timeitp.x,p.y,p.z282ns±2.52nsperloop(mean±std.dev.of7runs,1000000loopseach)In[12]:%timeitnew_p.x,new_p.y,new_p.z148ns±1.7nsperloop(mean±std.dev.of7runs,10000000loopseach)
如您所见,它在所有情况下都更快,包括type creation、object instantiation和attribute access。