рд╕рд╛рдЗрдерди рдФрд░ рд╕реА ++ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдпреЛрдЧ рдХреА рдХрд╣рд╛рдиреА

рдПрдХ рдЧрд░рдо рдПрдХ рд╕рд░реНрдж рд╕рд░реНрджрд┐рдпреЛрдВ рдХреА рд╢рд╛рдо рдореЗрдВ, рдореИрдВ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдЧрд░реНрдордЬреЛрд╢реА рд╕реЗ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╕реА ++ рд╡реЗрдХреНрдЯрд░ рд╕реАрдкреАрдереЙрди рд╕реВрдЪреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдХрдВрдкрдиреА рдореЗрдВ, рд╣рдо Django рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрддреНрдкрд╛рдж рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╕рд░рдгреА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдПрдХ рд╕рд╣рдХрд░реНрдореА рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ C ++ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ Guido рдФрд░ рд╕рдореБрджрд╛рдп рд╢рд╛рдпрдж C рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕реЗ рдереЛрдбрд╝реЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдиреБрдХрд╕рд╛рдиреЛрдВ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рд▓реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рд╛рдордЧреНрд░реА рдХреЗ 1M рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдФрд░ 100 рдмрд╛рд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред


рдкрд░рд┐рдгрд╛рдо, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдереЗ, рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ рднреАред


рдпрд╣ рдмрд╕ рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рд╣рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рд╛рдЗрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реАрдкреАрдереЙрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗред


рдмреВрде


  • рд▓рд┐рдирдХреНрд╕ рд╡рдирдЧреНрд░реЗрд╡рдирд╣рд╛рдЗрдЯ 4.18.14-рдЧрдгрдирд╛ # 1 рдПрд╕рдПрдордкреА рдкреНрд░реАрдореЗрдЪ рд╕рдд 13 рдЕрдХреНрдЯреВрдмрд░ 21:03:27 рдпреВрдЯреАрд╕реА 2018 x86_64 рдЗрдВрдЯреЗрд▓┬о рдХреЛрд░ (рдЯреАрдПрдо) i7-4770 рд╕реАрдкреАрдпреВ @ 3.40GHz рдЬреЗрдиреБрдЗрди рдЬреЗрдиреЗрд▓ / рд▓рд┐рдирдХреНрд╕
  • рдкрд╛рдпрдерди 2.7 рдФрд░ 3.6
  • рд╕рд╛рдЗрдереЙрди 0.28.3
  • gcc (Gentoo 7.3.0-r3 p1.4)

рд▓рд┐рдкрд┐


рд╡реИрд╕реЗ, рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рдерд╛ред рд╕рдмрд╕реЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛рдиреА рди рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╕реБрдкрд░-рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рднреА рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдбрд╛рдВрд╕ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдбрдл рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рд╣рдореЗрдВ рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдирд╛ рдерд╛, рдФрд░ рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд .h рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдерди рд░реИрдкрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛:


#    ctypedef vector[object] dict_vec #     (   vector.push_back(dict())) ctypedef vector[PyObject*] dict_vec #   ,   ( ,    object   PyObject.) ctypedef vector[PyObject] dict_vec 

рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рдХрд┐ рдкрд╛рдЗрдмреЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рдирд╛рд╢рд╛рд╣реА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдмреЗрд╢рдХ, рдпреЗ рд╕рд╛рдЗрдерди рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдПрдХ рдЫреЛрдЯреА рдмреИрд╕рд╛рдЦреА рдмрдирд╛рдиреА рдереА

 #include "Python.h" static PyObject * convert_to_pyobject(PyObject *obj) { return obj; } 

рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЬреЛ рдЪреАрдЬ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдбрд░рд╛рддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреНрдпреЛрдВ рдФрд░ рдХреНрдпрд╛ рд╣реЛрддреЗ рд╣реИрдВред


рдЕрдВрддрд┐рдо рд╕реВрддреНрд░

cython_experiments.h


 #include "Python.h" static PyObject * convert_to_pyobject(PyObject *obj) { return obj; } 

cython_experiments.pyx


 # -*- coding: utf-8 -*- # distutils: language = c++ # distutils: include=['./'] # distutils: extra_compile_args=["-O1"] from __future__ import unicode_literals import time from libc.stdlib cimport free from cpython.dict cimport PyDict_New, PyDict_SetItemString from cpython.ref cimport PyObject from libcpp.string cimport string from libcpp.vector cimport vector cdef extern from "cython_experiments.h": PyObject* convert_to_pyobject(object obj) ctypedef vector[PyObject*] dict_vec range_attempts = 10 ** 6 # Insert time cdef test_list(): t_start = time.time() data_list = list() for i from 0 <= i < range_attempts: data_list.append(dict( name = 'test_{}'.format(i), test_data = i, test_data2 = str(i), test_data3 = range(10), )) del data_list return time.time() - t_start cdef test_vector(): t_start = time.time() cdef dict_vec *data_list data_list = new dict_vec() data_list.resize(range_attempts) for i from 0 <= i < range_attempts: data = PyDict_New() PyDict_SetItemString(data, 'name', 'test_{}'.format(i)) PyDict_SetItemString(data, 'test_data', i) PyDict_SetItemString(data, 'test_data2', str(i)) PyDict_SetItemString(data, 'test_data3', range(10)) data_list.push_back(convert_to_pyobject(data)) free(data_list) return time.time() - t_start # Get statistic times = dict(list=[], vector=[]) attempts = 100 for i from 0 <= i < attempts: times['list'].append(test_list()) times['vector'].append(test_vector()) print(''' Attempt: {} List time: {} Vector time: {} '''.format(i, times['list'][-1], times['vector'][-1])) avg_list = sum(times['list']) / attempts avg_vector = sum(times['vector']) / attempts print(''' Statistics: attempts: {} list avg time: {} vector avg time: {} '''.format(attempts, avg_list, avg_vector)) 

рдкреНрд░рдпрд╛рд╕ 1


рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП *ред рдПрдХрддреНрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдШрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдзреНрд╡рдЬ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ 0. рдпрд╣ рдПрдХ рдЕрдЬреАрдм рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛:


 Python 2.7 Statistics: attempts: 100 list avg time: 2.61709237576 vector avg time: 2.92562381506 

рдереЛрдбрд╝рд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдЕрднреА рднреА -O1 рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рднреА рд╕рдорд╛рди рд╕реЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛:


 Python 2.7 Statistics: attempts: 100 list avg time: 2.49274396896 vector avg time: 0.922211170197 

рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рд╣реЛ рдЧрдпрд╛: рдлрд┐рд░ рднреА, рдЧреБрдЗрдбреЛ рдФрд░ рдХрдВрдкрдиреА рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХрддрд╛ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдиреЗ рдореБрдЭреЗ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдпрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдЦрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдЕрдВрдд рддрдХ рдпрд╣ рд▓рдЧрднрдЧ 20 рдЬреАрдмреА рд░реИрдо рдЦрд╛ рд░рд╣реА рдереАред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА: рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдЖрдк рд▓реВрдк рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдлреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╡рд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рдерд╛ред рдлрд┐рд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ ...


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдореИрдВ рдЬреАрд╕реА рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?


рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмреАрдЪ, рдореИрдВрдиреЗ gisdable () рдФрд░ gc.enable () рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рдмрд╛рдж рдмрдирд╛рдпрд╛ред рдореИрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:


 Python 2.7 Statistics: attempts: 100 list avg time: 1.00309731514 vector avg time: 0.941153049469 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдВрддрд░ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдЕрдзрд┐рдХ рднреБрдЧрддрд╛рди рдХрд┐рд╕реА рддрд░рд╣ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рд╕рд┐рд░реНрдл рд╕реАрдкреАрдереЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рд╛рдЗрдерди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред
рд╢рд╛рдпрдж рдХрдИ рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ: "рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реИ?" рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ (рдирд╣реАрдВ) рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВред рд╡рд╣ рдЙрд╕реА рджрд░ рдФрд░ рдЙрд╕реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмрдврд╝реАред рдПрдХ рд▓реЗрдЦ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╛рдпрдерди рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╣рд╛рдВ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдереА - рд╡реЗрдХреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ред


рдЕрдиреНрдд


рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдкреАрдбрд╝рд╛ рдХреЗ рдмрд╛рдж, рдЕрд░реНрдерд╛рддреН, рддрд╛рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рдПрдХ рд╕реВрдЪрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реА рдкрд░рд┐рдгрд╛рдореА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЬреАрд╕реА рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ 2.6 рдЧреБрдирд╛ (рд╡реЗрдХреНрдЯрд░ рддреЗрдЬ рд╣реИ) рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдЪреНрдЫреА рдореЗрдореЛрд░реА рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдФрд╕рдд рдЕрдВрддрд░ рдорд┐рд▓рд╛ред


рдЕрдЪрд╛рдирдХ рдпрд╣ рдореБрдЭ рдкрд░ рд╣рд╛рд╡реА рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ Py2.7 рдХреЗ рддрд╣рдд рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ 3.6 рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреАред


рдФрд░ рдпрд╣рд╛рдВ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдерд╛ (рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рдж, рдЖрд╢реНрдЪрд░реНрдп рддрд╛рд░реНрдХрд┐рдХ рдерд╛):


 Python 3.6 Statistics: attempts: 100 list avg time: 0.8771139788627624 vector avg time: 1.075702157020569 Python 2.7 Statistics: attempts: 100 list avg time: 2.61709237576 vector avg time: 0.92562381506 

рдЗрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдЬреАрд╕реА рдиреЗ рдЕрднреА рднреА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд╕реНрдореГрддрд┐ рдХреЛ рдЯрдЯреЛрд▓рдирд╛ рдирд╣реАрдВ рдерд╛, рдФрд░ рдпрд╣ рдПрдХ рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдереАред рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рдХреЗ рдмрд╛рдж, 2.7 рдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдореБрдЭреЗ рдЕрднреА рднреА рдЖрд╢реНрдЪрд░реНрдп рдерд╛ рдХрд┐ рдЙрдирдХреЗ рдмреАрдЪ рдРрд╕рд╛ рдЕрдВрддрд░ рдерд╛ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдореИрдВрдиреЗ рд╕реБрдирд╛ / рдкрдврд╝рд╛ / рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ Py3.6 Py2.7 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдЗрдерди-рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдХреБрдЫ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХрд┐рдпрд╛ рдФрд░ рдХрд▓реА рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рджреАред


рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдкрд╛рдпрдерди 2.7 рдХреЗ рд╕рдорд░реНрдерди рдФрд░ C ++ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд░реАрдореЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


UPD 12/24/2018:
ICpu рдХреА рд╕рд▓рд╛рд╣ рдкрд░ рдФрд░ рдкрдХреНрд╖ рдХреЗ рд╣рдорд▓реЛрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ, рдореИрдВрдиреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ C ++ рднрд╛рдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЧрд░реНрднрдкрд╛рдд рдХреЛ рднреА рдХрдо рдХрд┐рдпрд╛ред рдпрд╣ рдФрд░ рднреА рдмрджрддрд░ рдирд┐рдХрд▓рд╛:


рдЦрд░рд╛рдм C ++ рдЬреНрдЮрд╛рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо

cython_experiments.h


 #include "Python.h" #include <vector> #include <algorithm> #ifndef PyString_AsString #define PyString_AsString PyUnicode_AsUTF8 #define PyString_FromString PyUnicode_FromString #endif typedef struct { char* name; bool reverse; } sortFiled; class cmpclass { public: cmpclass(std::vector<char*> fields) { for (std::vector<char*>::iterator it = fields.begin() ; it < fields.end(); it++){ bool is_reverse = false; char* name; if (it[0] == "-"){ is_reverse = true; for(int i=1; i<strlen(*it); ++i) name[i] = *it[i]; } else { name = *it; } sortFiled field = {name, is_reverse}; this->fields_to_cmp.push_back(field); } } ~cmpclass() { this->fields_to_cmp.clear(); this->fields_to_cmp.shrink_to_fit(); } bool operator() (PyObject* left, PyObject* right) { // bool result = false; for (std::vector<sortFiled>::iterator it = this->fields_to_cmp.begin() ; it < this->fields_to_cmp.end(); it++){ // PyObject* str_name = PyString_FromString(it->name); PyObject* right_value = PyDict_GetItem(right, str_name); PyObject* left_value = PyDict_GetItem(left, str_name); if(!it->reverse){ result = left_value < right_value; } else { result = (left_value > right_value); } PyObject_Free(str_name); if(!result) return false; } return true; } private: std::vector<sortFiled> fields_to_cmp; }; void vector_multikeysort(std::vector<PyObject *> items, PyObject* columns, bool reverse) { std::vector<char *> _columns; for (int i=0; i<PyList_GET_SIZE(columns); ++i) { PyObject* item = PyList_GetItem(columns, i); char* item_str = PyString_AsString(item); _columns.push_back(item_str); } cmpclass cmp_obj(_columns); std::sort(items.begin(), items.end(), cmp_obj); if(reverse) std::reverse(items.begin(), items.end()); } std::vector<PyObject *> _test_vector(PyObject* store_data_list, PyObject* columns, bool reverse = false) { int range_attempts = PyList_GET_SIZE(store_data_list); std::vector<PyObject *> data_list; for (int i=0; i<range_attempts; ++i) { data_list.push_back(PyList_GetItem(store_data_list, i)); } vector_multikeysort(data_list, columns, reverse); return data_list; } 

cython_experiments.pyx


 # -*- coding: utf-8 -*- # distutils: language = c++ # distutils: include=['./'] # distutils: extra_compile_args=["-O2", "-ftree-vectorize"] from __future__ import unicode_literals import time from libc.stdlib cimport free from cpython.dict cimport PyDict_New, PyDict_SetItemString from cpython.ref cimport PyObject from libcpp.string cimport string from libcpp.vector cimport vector import gc cdef extern from "cython_experiments.h": vector[PyObject*] _test_vector(object store_data_list, object columns, int reverse) range_attempts = 10 ** 6 store_data_list = list() for i from 0 <= i < range_attempts: store_data_list.append(dict( name = 'test_{}'.format(i), test_data = i, test_data2 = str(i), test_data3 = range(10), )) # Insert time def multikeysort(items, columns, reverse=False): items = list(items) columns = list(columns) columns.reverse() for column in columns: # pylint: disable=cell-var-from-loop is_reverse = column.startswith('-') if is_reverse: column = column[1:] items.sort(key=lambda row: row[column], reverse=is_reverse) if reverse: items.reverse() return items cdef test_list(): t_start = time.time() data_list = list() for i in store_data_list: data_list.append(i) data_list = multikeysort(data_list, ('name', '-test_data'), True) for i in data_list: i del data_list return time.time() - t_start cdef test_vector(): t_start = time.time() data_list = _test_vector(store_data_list, ['name', '-test_data'], 1) for i in data_list: i return time.time() - t_start # Get statistic times = dict(list=[], vector=[]) attempts = 10 gc.disable() for i from 0 <= i < attempts: times['list'].append(test_list()) times['vector'].append(test_vector()) gc.collect() print(''' Attempt: {} List time: {} Vector time: {} '''.format(i, times['list'][-1], times['vector'][-1])) del store_data_list avg_list = sum(times['list']) / attempts avg_vector = sum(times['vector']) / attempts print(''' Statistics: attempts: {} list avg time: {} vector avg time: {} '''.format(attempts, avg_list, avg_vector)) 

 Python 3.6 Statistics: attempts: 10 list avg time: 0.2640914678573608 vector avg time: 2.5774293661117555 

рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХреЛрдкрд░реЗрдЯрд░ рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗ?

Source: https://habr.com/ru/post/hi433852/


All Articles