/pexp/management/commands/polybench.py

https://bitbucket.org/bconstantin/django_polymorphic/ · Python · 106 lines · 74 code · 21 blank · 11 comment · 10 complexity · e2b7f81a5d83858897061130db1a5b1f MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. """
  3. This module is a scratchpad for general development, testing & debugging
  4. """
  5. from django.core.management.base import NoArgsCommand
  6. from django.db.models import connection
  7. from pprint import pprint
  8. import settings
  9. import sys
  10. from pexp.models import *
  11. num_objects=1000
  12. def reset_queries():
  13. connection.queries=[]
  14. def show_queries():
  15. print; print 'QUERIES:',len(connection.queries); pprint(connection.queries); print; reset_queries()
  16. import time
  17. ###################################################################################
  18. ### benchmark wrappers
  19. def print_timing(func, message='', iterations=1):
  20. def wrapper(*arg):
  21. results=[]
  22. reset_queries()
  23. for i in xrange(iterations):
  24. t1 = time.time()
  25. x = func(*arg)
  26. t2 = time.time()
  27. results.append((t2-t1)*1000.0)
  28. res_sum=0
  29. for r in results: res_sum +=r
  30. median = res_sum / len(results)
  31. print '%s%-19s: %.0f ms, %i queries' % (
  32. message,func.func_name,
  33. median,
  34. len(connection.queries)/len(results)
  35. )
  36. sys.stdout.flush()
  37. return wrapper
  38. def run_vanilla_any_poly(func, iterations=1):
  39. f=print_timing(func,' ', iterations)
  40. f(nModelC)
  41. f=print_timing(func,'poly ', iterations)
  42. f(ModelC)
  43. ###################################################################################
  44. ### benchmarks
  45. def bench_create(model):
  46. for i in xrange(num_objects):
  47. model.objects.create(field1='abc'+str(i), field2='abcd'+str(i), field3='abcde'+str(i))
  48. #print 'count:',model.objects.count()
  49. def bench_load1(model):
  50. for o in model.objects.all():
  51. pass
  52. def bench_load1_short(model):
  53. for i in xrange(num_objects/100):
  54. for o in model.objects.all()[:100]:
  55. pass
  56. def bench_load2(model):
  57. for o in model.objects.all():
  58. f1=o.field1
  59. f2=o.field2
  60. f3=o.field3
  61. def bench_load2_short(model):
  62. for i in xrange(num_objects/100):
  63. for o in model.objects.all()[:100]:
  64. f1=o.field1
  65. f2=o.field2
  66. f3=o.field3
  67. def bench_delete(model):
  68. model.objects.all().delete()
  69. ###################################################################################
  70. ### Command
  71. class Command(NoArgsCommand):
  72. help = ""
  73. def handle_noargs(self, **options):
  74. print 'polybench - sqlite test db is stored in:',settings.SQLITE_DB_PATH
  75. func_list = [
  76. ( bench_delete, 1 ),
  77. ( bench_create, 1 ),
  78. ( bench_load1, 5 ),
  79. ( bench_load1_short, 5 ),
  80. ( bench_load2, 5 ),
  81. ( bench_load2_short, 5 )
  82. ]
  83. for f,iterations in func_list:
  84. run_vanilla_any_poly(f,iterations=iterations)
  85. print