PageRenderTime 64ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 1ms

/SQLAlchemy-0.7.8/test/perf/objselectspeed.py

#
Python | 146 lines | 117 code | 21 blank | 8 comment | 7 complexity | 81bf8d71432517d16a28b5f1e9c76f0b MD5 | raw file
  1. import time, resource
  2. from sqlalchemy import *
  3. from sqlalchemy.orm import *
  4. from test.lib.util import gc_collect
  5. from test.lib import profiling
  6. db = create_engine('sqlite://')
  7. metadata = MetaData(db)
  8. Person_table = Table('Person', metadata,
  9. Column('id', Integer, primary_key=True),
  10. Column('type', String(10)),
  11. Column('name', String(40)),
  12. Column('sex', Integer),
  13. Column('age', Integer))
  14. Employee_table = Table('Employee', metadata,
  15. Column('id', Integer, ForeignKey('Person.id'), primary_key=True),
  16. Column('foo', String(40)),
  17. Column('bar', Integer),
  18. Column('bat', Integer))
  19. class RawPerson(object): pass
  20. class Person(object): pass
  21. mapper(Person, Person_table)
  22. class JoinedPerson(object):pass
  23. class Employee(JoinedPerson):pass
  24. mapper(JoinedPerson, Person_table, \
  25. polymorphic_on=Person_table.c.type, polymorphic_identity='person')
  26. mapper(Employee, Employee_table, \
  27. inherits=JoinedPerson, polymorphic_identity='employee')
  28. compile_mappers()
  29. def setup():
  30. metadata.create_all()
  31. i = Person_table.insert()
  32. data = [{'name':'John Doe','sex':1,'age':35, 'type':'employee'}] * 100
  33. for j in xrange(500):
  34. i.execute(data)
  35. # note we arent fetching from employee_table,
  36. # so we can leave it empty even though its "incorrect"
  37. #i = Employee_table.insert()
  38. #data = [{'foo':'foo', 'bar':'bar':'bat':'bat'}] * 100
  39. #for j in xrange(500):
  40. # i.execute(data)
  41. print "Inserted 50,000 rows"
  42. def sqlite_select(entity_cls):
  43. conn = db.connect().connection
  44. cr = conn.cursor()
  45. cr.execute("SELECT id, name, sex, age FROM Person")
  46. people = []
  47. for row in cr.fetchall():
  48. person = entity_cls()
  49. person.id = row[0]
  50. person.name = row[1]
  51. person.sex = row[2]
  52. person.age = row[3]
  53. people.append(person)
  54. cr.close()
  55. conn.close()
  56. def sql_select(entity_cls):
  57. people = []
  58. for row in Person_table.select().execute().fetchall():
  59. person = entity_cls()
  60. person.id = row['id']
  61. person.name = row['name']
  62. person.sex = row['sex']
  63. person.age = row['age']
  64. people.append(person)
  65. #@profiling.profiled(report=True, always=True)
  66. def orm_select():
  67. session = create_session()
  68. people = session.query(Person).all()
  69. #@profiling.profiled(report=True, always=True)
  70. def joined_orm_select():
  71. session = create_session()
  72. people = session.query(JoinedPerson).all()
  73. def all():
  74. setup()
  75. try:
  76. t, t2 = 0, 0
  77. def usage(label):
  78. now = resource.getrusage(resource.RUSAGE_SELF)
  79. print "%s: %0.3fs real, %0.3fs user, %0.3fs sys" % (
  80. label, t2 - t,
  81. now.ru_utime - usage.last.ru_utime,
  82. now.ru_stime - usage.last.ru_stime)
  83. usage.snap(now)
  84. usage.snap = lambda stats=None: setattr(
  85. usage, 'last', stats or resource.getrusage(resource.RUSAGE_SELF))
  86. gc_collect()
  87. usage.snap()
  88. t = time.clock()
  89. sqlite_select(RawPerson)
  90. t2 = time.clock()
  91. usage('sqlite select/native')
  92. gc_collect()
  93. usage.snap()
  94. t = time.clock()
  95. sqlite_select(Person)
  96. t2 = time.clock()
  97. usage('sqlite select/instrumented')
  98. gc_collect()
  99. usage.snap()
  100. t = time.clock()
  101. sql_select(RawPerson)
  102. t2 = time.clock()
  103. usage('sqlalchemy.sql select/native')
  104. gc_collect()
  105. usage.snap()
  106. t = time.clock()
  107. sql_select(Person)
  108. t2 = time.clock()
  109. usage('sqlalchemy.sql select/instrumented')
  110. gc_collect()
  111. usage.snap()
  112. t = time.clock()
  113. orm_select()
  114. t2 = time.clock()
  115. usage('sqlalchemy.orm fetch')
  116. gc_collect()
  117. usage.snap()
  118. t = time.clock()
  119. joined_orm_select()
  120. t2 = time.clock()
  121. usage('sqlalchemy.orm "joined" fetch')
  122. finally:
  123. metadata.drop_all()
  124. if __name__ == '__main__':
  125. all()