Advertisement
pymen

Тест производительности обработки списков в Питоне

May 31st, 2013
570
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.33 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from numpy.random import random
  4. import time
  5.  
  6.  
  7. import time
  8.  
  9. def howlong(f):
  10.     def tmp(*args, **kwargs):
  11.         t = time.time()
  12.         res = f(*args, **kwargs)
  13.         need_time = time.time()-t
  14.         tmp.__name__ = f.__name__
  15.         tmp.__doc__ = f.__doc__
  16.         #print u"%s time: %f" % ((f.__doc__), need_time)
  17.         print ".",
  18.         return need_time
  19.     return tmp
  20.  
  21.  
  22. def test(tests):
  23.  
  24.     results = {}
  25.     for test in tests:
  26.         results[test.__doc__] = test()
  27.     print "\nRESULTS"
  28.  
  29.     sorted_results = sorted(results.items(), key=lambda x:x[1] )
  30.     best_name, best_result = sorted_results[0]
  31.     for name, result in sorted_results:
  32.         if name == best_name:
  33.             description = "100%"
  34.         else:
  35.             description = "%s%%" % (int(100 + 100 * (result - best_result) / best_result))
  36.         print "%70s - %20s - %10s" % (name, round(result, 3), description)
  37.     print "--"
  38.  
  39. ################
  40.  
  41. lst = []
  42. for i in range(1, 500000):
  43.     val = random() + i
  44.     lst.append(val)
  45.  
  46. GLOBAL_VALUE = 130.98098908
  47.  
  48. #############################
  49.  
  50. class TestList():
  51.     def __init__(self, lst):
  52.         self.lst = lst
  53.         self.attr_value = GLOBAL_VALUE
  54.  
  55.     def _process_method_square(self, value):
  56.         return value ** 2
  57.  
  58.     ####method
  59.  
  60.     def cls_process_list_method_add_attr_value(self):
  61.         new_lst = []
  62.         for l in self.lst:
  63.             new_lst.append(self._process_method_square(l))
  64.  
  65.         for nl in new_lst:
  66.             nl + self.attr_value
  67.  
  68.     def cls_process_list_method_add_local_value(self):
  69.         new_lst = []
  70.         for l in self.lst:
  71.             new_lst.append(self._process_method_square(l))
  72.  
  73.         local_value = GLOBAL_VALUE
  74.         for nl in new_lst:
  75.             nl + local_value
  76.  
  77.     def cls_process_list_method_add_global_value(self):
  78.         new_lst = []
  79.         for l in self.lst:
  80.             new_lst.append(self._process_method_square(l))
  81.  
  82.         for nl in new_lst:
  83.             nl + GLOBAL_VALUE
  84.  
  85.     ####local func
  86.  
  87.     def cls_process_list_local_func_add_local_value(self):
  88.         new_lst = []
  89.         local_func = global_func
  90.         for l in self.lst:
  91.             new_lst.append(local_func(l))
  92.  
  93.         local_value = GLOBAL_VALUE
  94.         for nl in new_lst:
  95.             nl + local_value
  96.  
  97.     def cls_process_list_local_func_add_global_value(self):
  98.         new_lst = []
  99.         local_func = global_func
  100.         for l in self.lst:
  101.             new_lst.append(local_func(l))
  102.  
  103.         for nl in new_lst:
  104.             nl + GLOBAL_VALUE
  105.  
  106.     def cls_process_list_local_func_add_attr_value(self):
  107.         new_lst = []
  108.         local_func = global_func
  109.         for l in self.lst:
  110.             new_lst.append(local_func(l))
  111.  
  112.         for nl in new_lst:
  113.             nl + self.attr_value
  114.  
  115.     ####global func
  116.  
  117.     def cls_process_list_global_func_add_local_value(self):
  118.         new_lst = []
  119.         for l in self.lst:
  120.             new_lst.append(global_func(l))
  121.  
  122.         local_value = GLOBAL_VALUE
  123.         for nl in new_lst:
  124.             nl + local_value
  125.  
  126.     def cls_process_list_global_func_add_global_value(self):
  127.         new_lst = []
  128.         for l in self.lst:
  129.             new_lst.append(global_func(l))
  130.  
  131.         for nl in new_lst:
  132.             nl + GLOBAL_VALUE
  133.  
  134.     def cls_process_list_global_func_add_attr_value(self):
  135.         new_lst = []
  136.         for l in self.lst:
  137.             new_lst.append(global_func(l))
  138.  
  139.         for nl in new_lst:
  140.             nl + self.attr_value
  141.  
  142.  
  143.     #iterators
  144.  
  145.     def cls_process_iterator_add_local(self):
  146.         new_lst = [l ** 2 for l in self.lst]
  147.         local_value = GLOBAL_VALUE
  148.         for nl in new_lst:
  149.             nl + local_value
  150.  
  151.     def cls_process_iterator_add_global(self):
  152.         new_lst = [l ** 2 for l in self.lst]
  153.         for nl in new_lst:
  154.             nl + GLOBAL_VALUE
  155.  
  156.     def cls_process_iterator_add_attr(self):
  157.         new_lst = [l ** 2 for l in self.lst]
  158.         local_value = GLOBAL_VALUE
  159.         for nl in new_lst:
  160.             nl + self.attr_value
  161.  
  162.  
  163. def get_lst_processing_class():
  164.     return  TestList(lst)
  165.  
  166. def global_func(i):
  167.     return i ** 2
  168.  
  169. ###############
  170. #method
  171. c1 = get_lst_processing_class()
  172. c2 = get_lst_processing_class()
  173. c3 = get_lst_processing_class()
  174. #local
  175. c4 = get_lst_processing_class()
  176. c5 = get_lst_processing_class()
  177. c6 = get_lst_processing_class()
  178. #global
  179. c7 = get_lst_processing_class()
  180. c8 = get_lst_processing_class()
  181. c9 = get_lst_processing_class()
  182. #iterator
  183. c10 = get_lst_processing_class()
  184. c11 = get_lst_processing_class()
  185. c12 = get_lst_processing_class()
  186.  
  187. #######################################
  188.  
  189.  
  190. @howlong
  191. def process_list_local_func_plus_local_value():
  192.     """Функция. Обработка в цикле с вызовом локальной функции и добавлением локальной переменной"""
  193.     local_plus_value = GLOBAL_VALUE
  194.  
  195.     def local_func(i):
  196.         return i ** 2
  197.  
  198.     new_lst = []
  199.     for i in lst:
  200.         new_lst.append(local_func(i))
  201.     for v in new_lst:
  202.         v + local_plus_value
  203.  
  204. @howlong
  205. def process_list_local_func_plus_global_value():
  206.     """Функция. Обработка в цикле с вызовом локальной функции и добавлением глобальной переменной"""
  207.     def local_func(i):
  208.         return i ** 2
  209.  
  210.     new_lst = []
  211.     for i in lst:
  212.         new_lst.append(local_func(i))
  213.     for v in new_lst:
  214.         v + GLOBAL_VALUE
  215.  
  216. ###
  217.  
  218. @howlong
  219. def process_list_global_func_plus_local_value():
  220.     """Функция. Обработка в цикле с вызовом глобальной функции и добавлением локальной переменной"""
  221.     local_plus_value = GLOBAL_VALUE
  222.     new_lst = []
  223.     for i in lst:
  224.         new_lst.append(global_func(i))
  225.     for v in new_lst:
  226.         v + local_plus_value
  227.  
  228. @howlong
  229. def process_list_global_func_plus_global_value():
  230.     """Функция. Обработка в цикле с вызовом глобальной функции и добавлением глобальной переменной"""
  231.     new_lst = []
  232.     for i in lst:
  233.         new_lst.append(global_func(i))
  234.     for v in new_lst:
  235.         v + GLOBAL_VALUE
  236.  
  237. ###
  238.  
  239. @howlong
  240. def process_list_wo_func_plus_global_value():
  241.     """Функция. Обработка в цикле без вызова внешних функций и добавлением глобальной переменной"""
  242.     new_lst = []
  243.     for i in lst:
  244.         new_lst.append(i**2)
  245.     for v in new_lst:
  246.         v + GLOBAL_VALUE
  247.  
  248. @howlong
  249. def process_list_wo_func_plus_local_value():
  250.     """Функция. Обработка в цикле без вызова внешних функций и добавлением локальной переменной"""
  251.     local_plus_value = GLOBAL_VALUE
  252.     new_lst = []
  253.     for i in lst:
  254.         new_lst.append(i**2)
  255.     for v in new_lst:
  256.         v + local_plus_value
  257.  
  258.  
  259. @howlong
  260. def process_list_iterator_plus_global_value():
  261.     """Функция. Обработка Генератором без вызова внешних функций и добавлением глобальной переменной"""
  262.     new_lst = [i ** 2 for i in lst]
  263.     for v in new_lst:
  264.         v + GLOBAL_VALUE
  265.  
  266. @howlong
  267. def process_list_iterator_plus_local_value():
  268.     """Функция. Обработка Генератором без вызова внешних функций и добавлением локальной переменной"""
  269.     local_plus_value = GLOBAL_VALUE
  270.     new_lst = [i ** 2 for i in lst]
  271.     for v in new_lst:
  272.         v + local_plus_value
  273.  
  274. @howlong
  275. def process_list_iterator_global_func_plus_global_value():
  276.     """Функция. Обработка Генератором с вызовом глобальной функции и добавлением глобальной переменной"""
  277.     new_lst = [global_func(i) for i in lst]
  278.     for v in new_lst:
  279.         v + GLOBAL_VALUE
  280.  
  281. @howlong
  282. def process_list_iterator_local_func_plus_local_value():
  283.     """Функция. Обработка Генератором с вызовом локальной функции и добавлением локальной переменной"""
  284.     local_plus_value = GLOBAL_VALUE
  285.     local_func = global_func
  286.     new_lst = [local_func(i) for i in lst]
  287.     for v in new_lst:
  288.         v + local_plus_value
  289.  
  290. ##
  291.  
  292. @howlong
  293. def process_list_map_plus_local_value():
  294.     """Функция. Обработка с использованием map и добавлением локальной переменной"""
  295.     local_plus_value = GLOBAL_VALUE
  296.     new_lst = map(lambda x : x**2, lst)
  297.     for v in new_lst:
  298.         v + local_plus_value
  299.  
  300. @howlong
  301. def process_list_map_plus_global_value():
  302.     """Функция. Обработка с использованием map и добавлением глобальной переменной"""
  303.     new_lst = map(lambda x : x**2, lst)
  304.     for v in new_lst:
  305.         v + GLOBAL_VALUE
  306.  
  307. @howlong
  308. def test_cls_method_add_global_value():
  309.     """Класс. Обработка вызовом метода класса и добавлением глобальной переменной"""
  310.     c1.cls_process_list_method_add_global_value()
  311.  
  312. @howlong
  313. def test_cls_method_add_local_value():
  314.     """Класс. Обработка вызовом метода класса и добавлением локальной переменной"""
  315.     c2.cls_process_list_method_add_local_value()
  316.  
  317. @howlong
  318. def test_cls_method_add_attr_value():
  319.     """Класс. Обработка вызовом метода класса и добавление значения аттрибута"""
  320.     c3.cls_process_list_method_add_attr_value()
  321.  
  322. @howlong
  323. def test_cls_localfunc_add_global_value():
  324.     """Класс. Обработка вызовом локальной функции и добавлением глобальной переменной"""
  325.     c4.cls_process_list_local_func_add_global_value()
  326.  
  327. @howlong
  328. def test_cls_localfunc_add_local_value():
  329.     """Класс. Обработка вызовом локальной функции и добавлением локальной переменной"""
  330.     c5.cls_process_list_local_func_add_local_value()
  331.  
  332. @howlong
  333. def test_cls_localfunc_add_attr_value():
  334.     """Класс. Обработка вызовом локальной функции и добавлением значения аттрибута"""
  335.     c6.cls_process_list_local_func_add_attr_value()
  336.  
  337.  
  338. @howlong
  339. def test_cls_globalfunc_add_global_value():
  340.     """Класс. Обработка вызовом глобальной функции и добавлением глобальной переменной"""
  341.     c7.cls_process_list_global_func_add_global_value()
  342.  
  343. @howlong
  344. def test_cls_globalfunc_add_local_value():
  345.     """Класс. Обработка вызовом глобальной функции и добавлением локальной переменной"""
  346.     c8.cls_process_list_global_func_add_local_value()
  347.  
  348. @howlong
  349. def test_cls_globalfunc_add_attr_value():
  350.     """Класс. Обработка вызовом глобальной функции и добавлением значения аттрибута"""
  351.     c9.cls_process_list_global_func_add_attr_value()
  352.  
  353. @howlong
  354. def test_cls_iterator_add_attr_value():
  355.     """Класс. Обработка Генератором без вызова внешних функций и добавлением значения аттрибута"""
  356.     c10.cls_process_iterator_add_attr()
  357.  
  358. @howlong
  359. def test_cls_iterator_add_local_value():
  360.     """Класс. Обработка Генератором без вызова внешних функций и добавлением локальной переменной"""
  361.     c11.cls_process_iterator_add_local()
  362.  
  363. @howlong
  364. def test_cls_iterator_add_global_value():
  365.     """Класс. Обработка Генератором без вызова внешних функций и добавлением значения глобальной переменной"""
  366.     c12.cls_process_iterator_add_global()
  367.  
  368.  
  369. tests = [
  370.     process_list_global_func_plus_local_value,
  371.     process_list_local_func_plus_local_value,
  372.     process_list_wo_func_plus_local_value,
  373.     process_list_iterator_plus_local_value,
  374.     process_list_map_plus_local_value,
  375.  
  376.     process_list_global_func_plus_global_value,
  377.     process_list_local_func_plus_global_value,
  378.     process_list_wo_func_plus_global_value,
  379.     process_list_iterator_plus_global_value,
  380.     process_list_map_plus_global_value,
  381.  
  382.     process_list_iterator_global_func_plus_global_value,
  383.     process_list_iterator_local_func_plus_local_value,
  384. ]
  385. tests2 = [
  386.     test_cls_method_add_global_value,
  387.     test_cls_method_add_local_value,
  388.     test_cls_method_add_attr_value,
  389.     test_cls_localfunc_add_global_value,
  390.     test_cls_localfunc_add_local_value,
  391.     test_cls_localfunc_add_attr_value,
  392.     test_cls_globalfunc_add_global_value,
  393.     test_cls_globalfunc_add_local_value,
  394.     test_cls_globalfunc_add_attr_value,
  395.     test_cls_iterator_add_attr_value,
  396.     test_cls_iterator_add_local_value,
  397.     test_cls_iterator_add_global_value,
  398.  
  399. ]
  400.  
  401. test(tests)
  402. test(tests2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement