{"id":286014,"date":"2017-05-07T16:40:03","date_gmt":"2017-05-07T12:40:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=286014"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=286014","title":{"rendered":"\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430"},"content":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041e\u0442\u043c\u0435\u0447\u0443 \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435 \u043e \u0441\u0430\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u043c.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>\u0417\u0430\u0434\u0430\u0447\u0430<\/h3>\n<p>  \u0415\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0438\u043f\u043e\u0432\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">8.348841409877572e-11*x1_*x2_*x3_*x4_*x5_*x6_*x7_ \u2014 3.480284409621004e-9*x1_*x2_*x3_*x4_*x5_*x6_ \u2014 1.44049340858321e-9*x1_*x2_*x3_*x4_*x5_*x7_ + 6.004816835089577e-8*x1_*x2_*x3_*x4_*x5_ \u2014 2.674192940005371e-9*x1_*x2_*x3_*x4_*x6_*x7_ + 1.1147596343241695e-7*x1_*x2_*x3_*x4_*x6_ + 4.614001865646533e-8*x1_*x2_*x3_*x4_*x7_ \u2014 1.92338517189701e-6*x1_*x2_*x3_*x4_ \u2014 3.980463071998064e-9*x1_*x2_*x3_*x5_*x6_*x7_ + 1.6592892295580475e-7*x1_*x2_*x3_*x5_*x6_ + 6.867815593308846e-8*x1_*x2_*x3_*x5_*x7_ \u2014 2.862906227803913e-6*x1_*x2_*x3_*x5_ + 1.2749703798969891e-7*x1_*x2_*x3_*x6_*x7_ \u2014 5.314820397426395e-6*x1_*x2_*x3_*x6_ \u2014 2.199809760060692e-6*x1_*x2_*x3_*x7_ + 9.1700905110223e-5*x1_*x2_*x3_ \u2014 1.846888532733293e-9*x1_*x2_*x4_*x5_*x6_*x7_ + 7.69890890657543e-8*x1_*x2_*x4_*x5_*x6_ + 3.1865865064706345e-8*x1_*x2_*x4_*x5_*x7_ \u2014 1.3283551698311385e-6*x1_*x2_*x4_*x5_ + 5.915714175810938e-8*x1_*x2_*x4_*x6_*x7_ \u2014 2.4660148079756056e-6*x1_*x2_*x4_*x6_ \u2014 1.0206861262244266e-6*x1_*x2_*x4_*x7_ + 4.254815271209286e-5*x1_*x2_*x4_ + 8.80537876744858e-8*x1_*x2_*x5_*x6_*x7_ \u2014 3.6705956013363683e-6*x1_*x2_*x5_*x6_ \u2014 1.5192633852443432e-6*x1_*x2_*x5_*x7_ + 6.333176170880347e-5*x1_*x2_*x5_ \u2014 2.820424906208041e-6*x1_*x2_*x6_*x7_ + 0.0001175717652455964*x1_*x2_*x6_ + 4.866307746134377e-5*x1_*x2_*x7_ \u2014 0.002028560982722154*x1_*x2_ \u2014 4.643965319933718e-9*x1_*x3_*x4_*x5_*x6_*x7_ + 1.9358756900289542e-7*x1_*x3_*x4_*x5_*x6_ + 8.012609870218512e-8*x1_*x3_*x4_*x5_*x7_ \u2014 3.3401232720775553e-6*x1_*x3_*x4_*x5_ + 1.4874948386055242e-7*x1_*x3_*x4_*x6_*x7_ \u2014 6.200746333919621e-6*x1_*x3_*x4_*x6_ \u2014 2.5664954382120103e-6*x1_*x3_*x4_*x7_ + 0.00010698650352362546*x1_*x3_*x4_ + 2.2140953873789337e-7*x1_*x3_*x5_*x6_*x7_ \u2014 9.229641340558273e-6*x1_*x3_*x5_*x6_ \u2014 3.8201582714825905e-6*x1_*x3_*x5_*x7_ + 0.00015924648463737888*x1_*x3_*x5_ \u2014 7.091903641665703e-6*x1_*x3_*x6_*x7_ + 0.00029563191995286495*x1_*x3_*x6_ + 0.00012236236302703984*x1_*x3_*x7_ \u2014 0.005100777187540484*x1_*x3_ + 1.0273144909755949e-7*x1_*x4_*x5_*x6_*x7_ \u2014 4.282446163036621e-6*x1_*x4_*x5_*x6_ \u2014 1.7725089771387925e-6*x1_*x4_*x5_*x7_ + 7.388851548491282e-5*x1_*x4_*x5_ \u2014 3.290560750768279e-6*x1_*x4_*x6_*x7_ + 0.0001371697701523112*x1_*x4_*x6_ + 5.6774712332795935e-5*x1_*x4_*x7_ \u2014 0.0023667012497318313*x1_*x4_ \u2014 4.897909687533869e-6*x1_*x5_*x6_*x7_ + 0.0002041734515648569*x1_*x5_*x6_ + 8.45076066374878e-5*x1_*x5_*x7_ \u2014 0.0035227700858871253*x1_*x5_ + 0.00015688350080537115*x1_*x6_*x7_ \u2014 0.006539819616205367*x1_*x6_ \u2014 0.0027068382268636906*x1_*x7_ + 0.11283680975413288*x1_ \u2014 1.4404933842970813e-9*x2_*x3_*x4_*x5_*x6_*x7_ + 6.004816833354854e-8*x2_*x3_*x4_*x5_*x6_ + 2.4854000114926666e-8*x2_*x3_*x4_*x5_*x7_ \u2014 1.0360597302149638e-6*x2_*x3_*x4_*x5_ + 4.614001870156814e-8*x2_*x3_*x4_*x6_*x7_ \u2014 1.923385171910888e-6*x2_*x3_*x4_*x6_ \u2014 7.960911484056199e-7*x2_*x3_*x4_*x7_ + 3.3185723683902546e-5*x2_*x3_*x4_ + 6.867815595043569e-8*x2_*x3_*x5_*x6_*x7_ \u2014 2.8629062278143214e-6*x2_*x3_*x5_*x6_ \u2014 1.1849599028824348e-6*x2_*x3_*x5_*x7_ + 4.9396042143235244e-5*x2_*x3_*x5_ \u2014 2.1998097600572225e-6*x2_*x3_*x6_*x7_ + 9.170090511020218e-5*x2_*x3_*x6_ + 3.795510120421959e-5*x2_*x3_*x7_ \u2014 0.0015821900589679597*x2_*x3_ + 3.1865865045624386e-8*x2_*x4_*x5_*x6_*x7_ \u2014 1.3283551698172608e-6*x2_*x4_*x5_*x6_ \u2014 5.498076038248229e-7*x2_*x4_*x5_*x7_ + 2.2919188659665732e-5*x2_*x4_*x5_ \u2014 1.0206861262122835e-6*x2_*x4_*x6_*x7_ + 4.254815271210674e-5*x2_*x4_*x6_ + 1.7610725219094348e-5*x2_*x4_*x7_ \u2014 0.0007341177730757296*x2_*x4_ \u2014 1.5192633852512821e-6*x2_*x5_*x6_*x7_ + 6.333176170880174e-5*x2_*x5_*x6_ + 2.6213082872067472e-5*x2_*x5_*x7_ \u2014 0.0010927142286346146*x2_*x5_ + 4.8663077461354176e-5*x2_*x6_*x7_ \u2014 0.002028560982722149*x2_*x6_ \u2014 0.0008396235272224249*x2_*x7_ + 0.03500040721534296*x2_ + 8.012609870391985e-8*x3_*x4_*x5_*x6_*x7_ \u2014 3.340123272067147e-6*x3_*x4_*x5_*x6_ \u2014 1.38248054011407e-6*x3_*x4_*x5_*x7_ + 5.762985469397186e-5*x3_*x4_*x5_ \u2014 2.566495438213745e-6*x3_*x4_*x6_*x7_ + 0.00010698650352363066*x3_*x4_*x6_ + 4.428182648625982e-5*x3_*x4_*x7_ \u2014 0.00184592488062541*x3_*x4_ \u2014 3.820158271480856e-6*x3_*x5_*x6_*x7_ + 0.00015924648463738755*x3_*x5_*x6_ + 6.591228770929172e-5*x3_*x5_*x7_ \u2014 0.0027476087026188038*x3_*x5_ + 0.00012236236302704678*x3_*x6_*x7_ \u2014 0.005100777187540465*x3_*x6_ \u2014 0.0021112170500446024*x3_*x7_ + 0.08800784408220161*x3_ \u2014 1.7725089771387925e-6*x4_*x5_*x6_*x7_ + 7.388851548491629e-5*x4_*x5_*x6_ + 3.058253437834488e-5*x4_*x5_*x7_ \u2014 0.0012748584600295945*x4_*x5_ + 5.677471233278379e-5*x4_*x6_*x7_ \u2014 0.002366701249731833*x4_*x6_ \u2014 0.0009795801398659112*x4_*x7_ + 0.040834615376717426*x4_ + 8.450760663750168e-5*x5_*x6_*x7_ \u2014 0.003522770085887094*x5_*x6_ \u2014 0.0014580782487184623*x5_*x7_ + 0.060781208246755536*x5_ \u2014 0.0027068382268636976*x6_*x7_ + 0.11283680975413288*x6_ + 0.04670327439658878*x7_ + 0.5527559695044361  <\/div>\n<\/div>\n<p> \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u043e\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0432\u044b\u0437\u043e\u0432\u0443 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b x1_, x2_,\u2026 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 \u0443\u043a\u043b\u043e\u043d\u043e\u043c \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c 1.<\/h4>\n<p> \u0412\u0440\u0435\u043c\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0430\u043c\u0438\u0445 \u0444\u043e\u0440\u043c\u0443\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u043b\u0438\u043a\u043e (\u0434\u043e \u043f\u0430\u0440\u044b \u043c\u0438\u043d\u0443\u0442 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0445 \u0444\u043e\u0440\u043c\u0443\u043b-\u0441\u0442\u0440\u043e\u043a \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u043c (\u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432).<\/p>\n<h4>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c 2.<\/h4>\n<p> \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u0441\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440, \u0442.\u0435. \u0432 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 x1_, x2_,\u2026 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0435.<\/p>\n<h4>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h4>\n<p> \u042f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 <a href=\"http:\/\/python.org\">Python 3x<\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0421\u0423\u0411\u0414 \u2014 <a href=\"http:\/\/redis.io\">Redis<\/a> (NoSQL).<br \/>  \u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e Redis. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0434\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0443; \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435; \u0434\u0430\u043b\u0435\u0435 \u043e\u043d\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0435\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f; \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0438 \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412\u0441\u0451. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435. \u0412 Redis \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0445\u044d\u0448\u0435\u0439, \u0442\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438\u043c \u0438 \u043d\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f?  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Python + Redis<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import redis r = redis.StrictRedis(host='localhost', port=6379, db=0) #\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 redis  r.hset('expr:1', 'expr', expr) #\u0437\u0430\u043f\u0438\u0441\u044c \u0441\u0430\u043c\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0432 \u0445\u044d\u0448 'expr:1' r.hset('expr:1', 'params', num) #\u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0438\u0441\u043b\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0445\u044d\u0448 'expr:1'  r.hget('expr:1', 'expr') #\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0438\u0437 \u0445\u044d\u0448\u0430 'expr:1' r.hget('expr:1', 'params') #\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 \u0445\u044d\u0448\u0430 'expr:1' <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0430\u043c\u0438\u043c\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 <a href=\"http:\/\/sympy.org\">Sympy<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u0435\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443-\u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438).<\/p>\n<h3>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u0414\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u043a\u043e\u0434\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c (\u0433\u0434\u0435-\u0442\u043e \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430):<\/p>\n<pre><code class=\"python\">class Profiler(object): #\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438     def __init__(self,info=''):         self.info = info     def __enter__(self):         self._startTime = time()     def __exit__(self, type, value, traceback):         print(self.info, &quot;Elapsed time: {:.3f} sec&quot;.format(time() - self._startTime))<\/code><\/pre>\n<p>  \u041f\u043e\u0435\u0445\u0430\u043b\u0438\u2026 \u0414\u043b\u044f \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0434\u0435\u043c num_iter = 1000 \u2014 \u0447\u0438\u0441\u043b\u043e \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0439.<br \/>  \u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u044b-\u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"python\">with Profiler('read (' + str(num_iter) + '): cycle'):     for i in range(num_iter):         f = open('expr.txt')         expr_txt = f.read()         f.close() &gt;&gt;read (1000): cycle Elapsed time: 0.014 sec<\/code><\/pre>\n<p>  \u0424\u043e\u0440\u043c\u0443\u043b\u0430-\u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0432 \u043d\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043a\u0430\u043a\u0438\u0435 \u043e\u043d\u0438 (\u0434\u043e\u043b\u0436\u043d\u044b \u0436\u0435 \u043c\u044b \u0437\u043d\u0430\u0442\u044c \u0432 \u043a\u0430\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f):<\/p>\n<pre><code class=\"python\">with Profiler('find unique sorted symbols (' + str(num_iter) + '): cycle'):     for i in range(num_iter):         symbols_set = set()         result = re.findall(r&quot;x\\d_&quot;, expr_txt)         for match in result:             symbols_set.add(match)         symbols_set = sorted(symbols_set)         symbols_list = symbols(symbols_set) &gt;&gt;find unique sorted symbols (1000): cycle Elapsed time: 0.156 sec<\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u0443-\u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"python\">with Profiler('sympify'):     expr = sympify(expr_txt) &gt;&gt;sympify Elapsed time: 0.426 sec<\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0435\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c:<\/p>\n<pre><code class=\"python\">with Profiler('subs cycle (' + str(num_iter) + '): cycle'):     for i in range(num_iter):         expr_copy = copy.copy(expr)         for x in symbols_list:             expr_copy = expr_copy.subs(x,1) &gt;&gt;subs cycle (1000): cycle Elapsed time: 0.245 sec<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c: sympy \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 (?) \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0446\u0438\u043a\u043b\u043e\u043c. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 expr_copy \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e.<br \/>  \u0412 sympy \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f numpy, \u0447\u0442\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442\u044b. \u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434:<\/p>\n<pre><code class=\"python\">with Profiler('lambdify'):     func = lambdify(tuple(symbols_list), expr, 'numpy') # returns a numpy-ready function &gt;&gt;lambdify Elapsed time: 0.114 sec<\/code><\/pre>\n<p>  \u041d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0440\u0430\u0434\u0443\u0435\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">with Profiler('subs cycle (' + str(num_iter) + '): lambdify'):     for i in range(num_iter):         func(*[1 for i in range(len(symbols_set))]) &gt;&gt;subs cycle (1000): lambdify Elapsed time: 0.026 sec<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u044d\u0442\u043e \u0443\u0440\u043e\u0432\u0435\u043d\u044c! \u0411\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u043a\u0443\u0441\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c 2). \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"python\">print('exp1 == exp2:', round(expr_copy,12) == round(func(*[1 for i in range(len(symbols_set))]),12)) &gt;&gt;exp1 == exp2: True<\/code><\/pre>\n<h4>\u0412\u044b\u0432\u043e\u0434 1.<\/h4>\n<p> \u0425\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443-\u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u043d\u0435\u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u2014 \u0432\u0435\u043b\u0438\u043a\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0418\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u0438\u0431\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c. \u0421\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2014 \u043a\u043b\u0430\u0441\u0441 sympy, \u043b\u044f\u043c\u0431\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 \u0442\u0430\u043a\u0436\u0435 \u043a\u043b\u0430\u0441\u0441 (\u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u043d\u0438\u043a\u0430\u043b). \u0411\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e pickle, cloudpickle, dill:<\/p>\n<pre><code class=\"python\">with Profiler('pickle_dumps cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         pickle_dump = pickle.dumps(expr) with Profiler('pickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         pickle.loads(pickle_dump) print() with Profiler('cloudpickle_dumps cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         cloudpickle_dump = cloudpickle.dumps(expr) with Profiler('cloudpickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         cloudpickle.loads(cloudpickle_dump) print() with Profiler('dill_dumps cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         dill_dump = dill.dumps(expr) with Profiler('dill_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         dill.loads(dill_dump)  &gt;&gt;pickle_dumps cycle (1000): sympifyed expr Elapsed time: 0.430 sec &gt;&gt;pickle_loads cycle (1000): sympifyed expr Elapsed time: 2.320 sec &gt;&gt; &gt;&gt;cloudpickle_dumps cycle (1000): sympifyed expr Elapsed time: 7.584 sec &gt;&gt;cloudpickle_loads cycle (1000): sympifyed expr Elapsed time: 2.314 sec &gt;&gt; &gt;&gt;dill_dumps cycle (1000): sympifyed expr Elapsed time: 8.259 sec &gt;&gt;dill_loads cycle (1000): sympifyed expr Elapsed time: 2.806 sec<\/code><\/pre>\n<p>  \u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e pickle \u0441\u0443\u043f\u0435\u0440 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 \u00ab\u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438\u00bb. \u0412\u0440\u0435\u043c\u044f \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e\/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c\/\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 Redis. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e pickle \u043d\u0435 \u0441\u0443\u043c\u0435\u043b \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<pre><code class=\"python\">with Profiler('redis_set cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.set('expr', pickle_dump) with Profiler('redis_get cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.get('expr') print() with Profiler('pickle_dumps + redis_set cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.set('expr', pickle.dumps(expr)) with Profiler('redis_get + pickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         pickle.loads(r.get('expr')) print() with Profiler('cloudpickle_dumps + redis_set cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.set('expr', cloudpickle.dumps(expr)) with Profiler('redis_get + cloudpickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         cloudpickle.loads(r.get('expr')) print() with Profiler('dill_dumps + redis_set cycle (' + str(num_iter) + '): lambdifyed expr'):     for i in range(num_iter):         r.set('expr', dill.dumps(expr)) with Profiler('redis_get + dill_loads cycle (' + str(num_iter) + '): lambdifyed expr'):     for i in range(num_iter):         dill.loads(r.get('expr')) &gt;&gt;redis_set cycle (1000): sympifyed expr Elapsed time: 0.066 sec &gt;&gt;redis_get cycle (1000): sympifyed expr Elapsed time: 0.051 sec &gt;&gt; &gt;&gt;pickle_dumps + redis_set cycle (1000): sympifyed expr Elapsed time: 0.524 sec &gt;&gt;redis_get + pickle_loads cycle (1000): sympifyed expr Elapsed time: 2.437 sec &gt;&gt; &gt;&gt;cloudpickle_dumps + redis_set cycle (1000): sympifyed expr Elapsed time: 7.659 sec &gt;&gt;redis_get + cloudpickle_loads cycle (1000): sympifyed expr Elapsed time: 2.492 sec &gt;&gt; &gt;&gt;dill_dumps + redis_set cycle (1000): lambdifyed expr Elapsed time: 8.333 sec &gt;&gt;redis_get + dill_loads cycle (1000): lambdifyed expr Elapsed time: 2.932 sec<\/code><\/pre>\n<p>  cloudpickle \u0438 dill \u0441 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439\/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u043f\u0440\u0430\u0432\u0434\u0430, cloudpickle \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c).<\/p>\n<h4>\u0412\u044b\u0432\u043e\u0434 2.<\/h4>\n<p> Redis \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0442\u0435\u043d\u0438\u0435\/\u0437\u0430\u043f\u0438\u0441\u044c 1000 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043e\u0442 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u044b-\u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043e \u0432\u044b\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e \u043d\u0435\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">print('\\nFINAL performance test:') with Profiler('sympify + pickle_dumps_sympifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         r.set('expr', pickle.dumps(expr)) with Profiler('redis_get + pickle_loads_sympifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = pickle.loads(r.get('expr'))         expr_copy = copy.copy(loaded_expr)         for x in symbols_list:             expr_copy = expr_copy.subs(x,1) with Profiler('sympify + lambdify + dill_dumps_lambdifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         func = lambdify(tuple(symbols_list), expr, 'numpy')         r.set('expr', dill.dumps(expr)) with Profiler('redis_get + dill_loads_lambdifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = dill.loads(r.get('expr'))         func(*[1 for i in range(len(symbols_set))]) with Profiler('sympify + cloudpickle_dumps_sympifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         r.set('expr', cloudpickle.dumps(expr)) with Profiler('redis_get + cloudpickle_loads_sympifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = cloudpickle.loads(r.get('expr'))         expr_copy = copy.copy(loaded_expr)         for x in symbols_list:             expr_copy = expr_copy.subs(x,1) with Profiler('sympify + lambdify + cloudpickle_dumps_lambdifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         func = lambdify(tuple(symbols_list), expr, 'numpy')         r.set('expr', cloudpickle.dumps(expr)) with Profiler('redis_get + cloudpickle_loads_lambdifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = cloudpickle.loads(r.get('expr'))         func(*[1 for i in range(len(symbols_set))])  &gt;&gt;FINAL performance test: &gt;&gt;sympify + pickle_dumps_sympifyed_expr + redis_set cycle (1000):  Elapsed time: 15.075 sec &gt;&gt;redis_get + pickle_loads_sympifyed_expr + subs cycle (1000):  Elapsed time: 2.929 sec &gt;&gt;sympify + lambdify + dill_dumps_lambdifyed_expr + redis_set cycle (1000):  Elapsed time: 87.707 sec &gt;&gt;redis_get + dill_loads_lambdifyed_expr + subs cycle (1000):  Elapsed time: 2.356 sec &gt;&gt;sympify + cloudpickle_dumps_sympifyed_expr + redis_set cycle (1000):  Elapsed time: 23.633 sec &gt;&gt;redis_get + cloudpickle_loads_sympifyed_expr + subs cycle (1000):  Elapsed time: 3.059 sec &gt;&gt;sympify + lambdify + cloudpickle_dumps_lambdifyed_expr + redis_set cycle (1000):  Elapsed time: 86.739 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + subs cycle (1000):  Elapsed time: 1.721 sec<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0412\u044b\u0432\u043e\u0434 3.<\/h4>\n<p> \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0435\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e cloudpickle, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0441\u0430\u043c\u044b\u043c\u0438 \u0434\u043e\u043b\u0433\u0438\u043c\u0438, \u041d\u041e, \u0435\u0441\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c 1) \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0442\u043e\u2026 Cloudpickle \u043c\u043e\u043b\u043e\u0434\u0435\u0446! \u0423\u0434\u0430\u043b\u043e\u0441\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0437 \u0431\u0430\u0437\u044b, \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c 1000 \u0440\u0430\u0437 \u0437\u0430 1,7 \u0441\u0435\u043a. \u0427\u0442\u043e, \u0432 \u0446\u0435\u043b\u043e\u043c, \u0445\u043e\u0440\u043e\u0448\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b-\u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0411\u0443\u0434\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0433\u0440\u0443\u043f\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0430\u043c\u0438 \u0441 \u043d\u0430\u0434\u0435\u0436\u0434\u043e\u0439 \u043d\u0430 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:<\/p>\n<pre><code class=\"python\">print('\\nTEST performance for complex requests:')  for x in [1,10,100,1000]:     with Profiler('redis_get + cloudpickle_loads_lambdifyed_expr + ' + str(x) + '*subs cycle (' + str(round(num_iter\/x)) + '): '):         for i in range(round(num_iter\/x)):             loaded_expr = cloudpickle.loads(r.get('expr'))             for j in range(x):                 func(*[1 for i in range(len(symbols_set))])  &gt;&gt;TEST performance for complex requests: &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 1*subs cycle (1000):  Elapsed time: 1.768 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 10*subs cycle (100):  Elapsed time: 0.204 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 100*subs cycle (10):  Elapsed time: 0.046 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 1000*subs cycle (1):  Elapsed time: 0.028 sec<\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c. \u0420\u0430\u0441\u0447\u0435\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438: \u041e\u0421 Ubuntu 16.04.2 LTS, \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 Intel&reg; Core(TM) i7-4720HQ CPU @ 2.60GHz (\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e 1 \u044f\u0434\u0440\u043e), DDR3-1600 (\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e 1Gb).<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/h3>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440! \u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u0440\u0438\u0442\u0438\u043a\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c.<\/p>\n<p>  \u0412 \u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0438\u0434\u0435\u0438 \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 <a href=\"http:\/\/stackoverflow.com\/questions\/34106484\/evaluating-a-mathematical-expression-function-for-a-large-number-of-input-valu\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u00ab\u0441\u043b\u0430\u0431\u0430\u044f\u00bb \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432) \u0438 <a href=\"http:\/\/stackoverflow.com\/questions\/31314517\/how-to-serialize-sympy-lambdified-function\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0439).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import redis  import pickle import dill import cloudpickle  import re import copy from time import time from sympy.utilities.lambdify import lambdify from sympy import sympify, symbols  class Profiler(object): #\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438     def __init__(self,info=''):         self.info = info     def __enter__(self):         self._startTime = time()     def __exit__(self, type, value, traceback):         print(self.info, &quot;Elapsed time: {:.3f} sec&quot;.format(time() - self._startTime))  num_iter = 1000  dill.settings['recurse'] = True  r = redis.StrictRedis(host='localhost', port=6379, db=0)  with Profiler('read (' + str(num_iter) + '): cycle'):     for i in range(num_iter):         f = open('expr.txt')         expr_txt = f.read()         f.close()  with Profiler('find unique sorted symbols (' + str(num_iter) + '): cycle'):     for i in range(num_iter):         symbols_set = set()         result = re.findall(r&quot;x\\d_&quot;, expr_txt)         for match in result:             symbols_set.add(match)         symbols_set = sorted(symbols_set)         symbols_list = symbols(symbols_set)  print()  with Profiler('sympify'):     expr = sympify(expr_txt)  with Profiler('lambdify'):     func = lambdify(tuple(symbols_list), expr, 'numpy') # returns a numpy-ready function  print()  with Profiler('subs cycle (' + str(num_iter) + '): cycle'):     for i in range(num_iter):         expr_copy = copy.copy(expr)         for x in symbols_list:             expr_copy = expr_copy.subs(x,1)  with Profiler('subs cycle (' + str(num_iter) + '): lambdify'):     for i in range(num_iter):         func(*[1 for i in range(len(symbols_set))])  print()  print('exp1 == exp2:', round(expr_copy,12) == round(func(*[1 for i in range(len(symbols_set))]),12))  print()  with Profiler('pickle_dumps cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         pickle_dump = pickle.dumps(expr)  with Profiler('pickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         pickle.loads(pickle_dump)  print()  with Profiler('cloudpickle_dumps cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         cloudpickle_dump = cloudpickle.dumps(expr)  with Profiler('cloudpickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         cloudpickle.loads(cloudpickle_dump)  print()  with Profiler('dill_dumps cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         dill_dump = dill.dumps(expr)  with Profiler('dill_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         dill.loads(dill_dump)  print()  #\u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442 (\u0434\u043e 12 \u0437\u043d\u0430\u043a\u0430), \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0431\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 redis  with Profiler('redis_set cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.set('expr', pickle_dump)  with Profiler('redis_get cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.get('expr')  print()  with Profiler('pickle_dumps + redis_set cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.set('expr', pickle.dumps(expr))  with Profiler('redis_get + pickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         pickle.loads(r.get('expr'))  print()  with Profiler('cloudpickle_dumps + redis_set cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         r.set('expr', cloudpickle.dumps(expr))  with Profiler('redis_get + cloudpickle_loads cycle (' + str(num_iter) + '): sympifyed expr'):     for i in range(num_iter):         cloudpickle.loads(r.get('expr'))  print()  with Profiler('dill_dumps + redis_set cycle (' + str(num_iter) + '): lambdifyed expr'):     for i in range(num_iter):         r.set('expr', dill.dumps(expr))  with Profiler('redis_get + dill_loads cycle (' + str(num_iter) + '): lambdifyed expr'):     for i in range(num_iter):         dill.loads(r.get('expr'))  print('\\nFINAL performance test:')  with Profiler('sympify + pickle_dumps_sympifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         r.set('expr', pickle.dumps(expr))  with Profiler('redis_get + pickle_loads_sympifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = pickle.loads(r.get('expr'))         expr_copy = copy.copy(loaded_expr)         for x in symbols_list:             expr_copy = expr_copy.subs(x,1)  with Profiler('sympify + lambdify + dill_dumps_lambdifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         func = lambdify(tuple(symbols_list), expr, 'numpy')         r.set('expr', dill.dumps(expr))  with Profiler('redis_get + dill_loads_lambdifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = dill.loads(r.get('expr'))         func(*[1 for i in range(len(symbols_set))])  with Profiler('sympify + cloudpickle_dumps_sympifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         r.set('expr', cloudpickle.dumps(expr))  with Profiler('redis_get + cloudpickle_loads_sympifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = cloudpickle.loads(r.get('expr'))         expr_copy = copy.copy(loaded_expr)         for x in symbols_list:             expr_copy = expr_copy.subs(x,1)  with Profiler('sympify + lambdify + cloudpickle_dumps_lambdifyed_expr + redis_set cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         expr = sympify(expr_txt)         func = lambdify(tuple(symbols_list), expr, 'numpy')         r.set('expr', cloudpickle.dumps(expr))  with Profiler('redis_get + cloudpickle_loads_lambdifyed_expr + subs cycle (' + str(num_iter) + '): '):     for i in range(num_iter):         loaded_expr = cloudpickle.loads(r.get('expr'))         func(*[1 for i in range(len(symbols_set))])  print('\\nTEST performance for complex requests:')  for x in [1,10,100,1000]:     with Profiler('redis_get + cloudpickle_loads_lambdifyed_expr + ' + str(x) + '*subs cycle (' + str(round(num_iter\/x)) + '): '):         for i in range(round(num_iter\/x)):             loaded_expr = cloudpickle.loads(r.get('expr'))             for j in range(x):                 func(*[1 for i in range(len(symbols_set))])   #r.set('expr', func)  &gt;&gt;read (1000): cycle Elapsed time: 0.014 sec &gt;&gt;find unique sorted symbols (1000): cycle Elapsed time: 0.156 sec &gt;&gt; &gt;&gt;sympify Elapsed time: 0.426 sec &gt;&gt;lambdify Elapsed time: 0.114 sec &gt;&gt; &gt;&gt;subs cycle (1000): cycle Elapsed time: 0.245 sec &gt;&gt;subs cycle (1000): lambdify Elapsed time: 0.026 sec &gt;&gt; &gt;&gt;exp1 == exp2: True &gt;&gt; &gt;&gt;pickle_dumps cycle (1000): sympifyed expr Elapsed time: 0.430 sec &gt;&gt;pickle_loads cycle (1000): sympifyed expr Elapsed time: 2.320 sec &gt;&gt; &gt;&gt;cloudpickle_dumps cycle (1000): sympifyed expr Elapsed time: 7.584 sec &gt;&gt;cloudpickle_loads cycle (1000): sympifyed expr Elapsed time: 2.314 sec &gt;&gt; &gt;&gt;dill_dumps cycle (1000): sympifyed expr Elapsed time: 8.259 sec &gt;&gt;dill_loads cycle (1000): sympifyed expr Elapsed time: 2.806 sec &gt;&gt; &gt;&gt;redis_set cycle (1000): sympifyed expr Elapsed time: 0.066 sec &gt;&gt;redis_get cycle (1000): sympifyed expr Elapsed time: 0.051 sec &gt;&gt; &gt;&gt;pickle_dumps + redis_set cycle (1000): sympifyed expr Elapsed time: 0.524 sec &gt;&gt;redis_get + pickle_loads cycle (1000): sympifyed expr Elapsed time: 2.437 sec &gt;&gt; &gt;&gt;cloudpickle_dumps + redis_set cycle (1000): sympifyed expr Elapsed time: 7.659 sec &gt;&gt;redis_get + cloudpickle_loads cycle (1000): sympifyed expr Elapsed time: 2.492 sec &gt;&gt; &gt;&gt;dill_dumps + redis_set cycle (1000): lambdifyed expr Elapsed time: 8.333 sec &gt;&gt;redis_get + dill_loads cycle (1000): lambdifyed expr Elapsed time: 2.932 sec &gt;&gt; &gt;&gt;FINAL performance test: &gt;&gt;sympify + pickle_dumps_sympifyed_expr + redis_set cycle (1000):  Elapsed time: 15.075 sec &gt;&gt;redis_get + pickle_loads_sympifyed_expr + subs cycle (1000):  Elapsed time: 2.929 sec &gt;&gt;sympify + lambdify + dill_dumps_lambdifyed_expr + redis_set cycle (1000):  Elapsed time: 87.707 sec &gt;&gt;redis_get + dill_loads_lambdifyed_expr + subs cycle (1000):  Elapsed time: 2.356 sec &gt;&gt;sympify + cloudpickle_dumps_sympifyed_expr + redis_set cycle (1000):  Elapsed time: 23.633 sec &gt;&gt;redis_get + cloudpickle_loads_sympifyed_expr + subs cycle (1000):  Elapsed time: 3.059 sec &gt;&gt;sympify + lambdify + cloudpickle_dumps_lambdifyed_expr + redis_set cycle (1000):  Elapsed time: 86.739 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + subs cycle (1000):  Elapsed time: 1.721 sec &gt;&gt; &gt;&gt;TEST performance for complex requests: &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 1*subs cycle (1000):  Elapsed time: 1.768 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 10*subs cycle (100):  Elapsed time: 0.204 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 100*subs cycle (10):  Elapsed time: 0.046 sec &gt;&gt;redis_get + cloudpickle_loads_lambdifyed_expr + 1000*subs cycle (1):  Elapsed time: 0.028 sec<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u0434\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b expr.txt \u0440\u044f\u0434\u043e\u043c \u0441 python-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0443-\u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430<\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 redis, dill, cloudpickle, sympy, numpy<\/li>\n<\/ul>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/328170\/\"> https:\/\/habrahabr.ru\/post\/328170\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041e\u0442\u043c\u0435\u0447\u0443 \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435 \u043e \u0441\u0430\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u043c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-286014","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=286014"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286014\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=286014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=286014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}