{"id":308121,"date":"2020-08-06T21:00:41","date_gmt":"2020-08-06T21:00:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=308121"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=308121","title":{"rendered":"\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u0432 Ruby \u0438 Python?"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/514132\/\"><b><i>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430 <a href=\"https:\/\/otus.pw\/uLfr\/\">\u00ab\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a Python\u00bb<\/a>.<\/i><\/b><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hh\/kk\/fe\/hhkkfevorzftbmp9ukvvgv0bmos.png\"><\/p>\n<hr>\n<p>   \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043f\u0435\u0440\u0438\u0442\u0438\u0432\u0430 \u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0443 \u043d\u0430 Ruby \u044f \u0445\u043e\u0442\u0435\u043b\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u043d\u0430 Ruby \u0438 Python. \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439: \u00ab\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440?\u00bb<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 (\u0430 \u043d\u0435, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438\/\u043a\u0443\u0447\u0438). \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u043a\u0430\u0436\u0443 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 Ruby \u0438 Python, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c.<a name=\"habracut\"><\/a><\/p>\n<p>  \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 (\u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043a \u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0430 \u043a\u043e\u0434 14 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433\u0430, \u0438 \u0441\u043e \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0438\u0437 \u043d\u0438\u0445 \u044f \u0431\u044b\u043b\u0430 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0430 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430), \u0442\u0430\u043a \u0447\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0434\u0430\u0439\u0442\u0435 \u043c\u043d\u0435 \u0437\u043d\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0445 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435.<\/p>\n<h3>2 \u0432\u0438\u0434\u0430 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432<\/h3>\n<p>   \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0438\u0434\u0430 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u2013 <i>sampling-<\/i> \u0438 <i>tracing-<\/i>\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b.<\/p>\n<p>  Tracing-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043e\u0442\u0447\u0435\u0442. Sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043e\u043d\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0441\u0442\u0435\u043a \u043a\u0430\u0436\u0434\u044b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043e\u0442\u0447\u0435\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 \u0432\u043c\u0435\u0441\u0442\u043e tracing-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430 \u2013 \u044d\u0442\u043e \u0435\u0433\u043e \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0441\u0442\u044c. \u0414\u0435\u043b\u0430\u0435\u0442\u0435 \u0432\u044b 20 \u0438\u043b\u0438 200 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e (80% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 200 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0431\u0443\u0434\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438!<\/p>\n<h3>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b<\/h3>\n<p>   \u0414\u0430\u043b\u044c\u0448\u0435 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0431\u0449\u0443\u044e \u0441\u0432\u043e\u0434\u043a\u0443 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432, \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435(<a href=\"https:\/\/gist.github.com\/jvns\/b81eb039f6373bc577d7dbdd978581b5\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>). \u042f \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0442\u0435\u0440\u043c\u0438\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0435 (<i>setitimer<\/i>, <i>rb_add_event_hook<\/i>, <i>ptrace<\/i>) \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<h3>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b Python<\/h3>\n<p>   <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yz\/_x\/vv\/yz_xvvmm2n7tgel6ohna1a4vw60.png\"><\/p>\n<p>  <i>\u00abgdb hacks\u00bb<\/i> \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 Python \u2014 \u043e\u043d \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u0430\u043a\u0435\u0440\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 shell-\u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 <i>gdb<\/i>. \u0420\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043e Python, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 <i>gbd<\/i> \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u0434\u043b\u044f \u0432\u0430\u0441 \u0441\u0442\u0435\u043a Python. \u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <i>pyflame<\/i> \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445.<\/p>\n<h3>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b Ruby<\/h3>\n<p>   <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5h\/on\/i4\/5honi4wymyecx8lutpmrs6_hqnk.png\"><\/p>\n<p>  <b>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u0436\u0438\u0432\u0443\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/b><\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432, \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0432\u0435\u0449\u044c \u2013 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b, \u043a\u0440\u043e\u043c\u0435 <i>pyflame<\/i>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 Python\/Ruby. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435\u0441\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 Python\/Ruby, \u0443 \u0432\u0430\u0441, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0435\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u0435\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430:<\/p>\n<pre><code class=\"python\">import sys import traceback  def bar():     foo()  def foo():     for _, frame in sys._current_frames().items():         for line in traceback.extract_stack(frame):             print line  bar()<\/code><\/pre>\n<p>   \u0412\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043d\u0441\u043e\u043b\u0438. \u0412\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430, \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a, \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u2013 \u0432\u0441\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<pre><code class=\"python\">('test2.py', 12, '&lt;module&gt;', 'bar()') ('test2.py', 5, 'bar', 'foo()') ('test2.py', 9, 'foo', 'for line in traceback.extract_stack(frame):')<\/code><\/pre>\n<p>   \u0412 Ruby \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0449\u0435: \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>puts caller<\/i>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0435\u043a.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u0421 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430 Ruby\/Python \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u043b\u0435\u0433\u043a\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0435\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<h3>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 tracing-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b<\/h3>\n<p>   \u042f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043b\u0430 \u0432\u0441\u0435 <i>tracing<\/i>-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b Ruby \u0438 Python \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0432\u044b\u0448\u0435: <i>rblineprof, ruby-prof, line_profiler \u0438 cProfile<\/i>. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041e\u043d\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u0421 \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442? \u0418 \u0432 Ruby, \u0438 \u0432 Python \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0431\u044d\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00ab\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00bb \u0438\u043b\u0438 \u00ab\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u0434\u0430\u00bb). \u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0431\u044d\u043a, \u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<p>  \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u044d\u0442\u0438 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043e\u0448\u043b\u044e\u0441\u044c \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 github.<\/p>\n<p>  \u0412 Python \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>PyEval_SetTrace<\/code> \u0438\u043b\u0438 <code>PyEval_SetProfile<\/code>. \u042d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/docs.python.org\/3\/c-api\/init.html#c.Py_tracefunc\">Profiling and Tracing<\/a> \u043f\u043e Python. \u0422\u0430\u043c \u0441\u043a\u0430\u0437\u0430\u043d\u043e: \u00ab<code>PyEval_SetTrace<\/code> \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 <code>PyEval_SetProfile<\/code>, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u00bb.<\/p>\n<p>  \u041a\u043e\u0434:<\/p>\n<ul>\n<li><code>line_profiler<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043a\u043e\u043b\u043b\u0431\u044d\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>PyEval_SetTrace<\/code>: \u0441\u043c. <code>line_profiler.pyx<\/code> \u0441\u0442\u0440\u043e\u043a\u0430 <a href=\"https:\/\/github.com\/rkern\/line_profiler\/blob\/4e3ce5957932806da86cbe27c75470c105d51acf\/_line_profiler.pyx#L157-L158\">157<\/a><\/li>\n<li><code>cProfile<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043a\u043e\u043b\u043b\u0431\u044d\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>PyEval_SetProfile<\/code>: \u0441\u043c. <code>_lsprof.c<\/code> <a href=\"https:\/\/github.com\/python\/cpython\/blob\/1b7c11ff0ee3efafbf5b38c3c6f37de5d63efb81\/Modules\/_lsprof.c#L693\">\u0441\u0442\u0440\u043e\u043a\u0430 693<\/a>(cProfile \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/python\/cpython\/blob\/1b7c11ff0ee3efafbf5b38c3c6f37de5d63efb81\/Lib\/cProfile.py#L9\">lsprof<\/a>)<\/li>\n<\/ul>\n<p>   \u0412 Ruby \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>rb_add_event_hook<\/code>. \u042f \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0430 \u043d\u0430\u0439\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e \u044d\u0442\u043e, \u043d\u043e \u0432\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442<\/p>\n<pre><code class=\"ruby\">rb_add_event_hook(prof_event_hook,       RUBY_EVENT_CALL | RUBY_EVENT_RETURN |       RUBY_EVENT_C_CALL | RUBY_EVENT_C_RETURN |       RUBY_EVENT_LINE, self);<\/code><\/pre>\n<p>   \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 <code>prof_event_hook<\/code>:<\/p>\n<pre><code class=\"ruby\">static void prof_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE klass)<\/code><\/pre>\n<p>  \u0427\u0435\u043c-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 <code>PyEval_SetTrace<\/code> \u0432 Python, \u043d\u043e \u0432 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u2013 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c, \u043e \u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00ab\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439\u00bb).<\/p>\n<p>  \u041a\u043e\u0434:<\/p>\n<ul>\n<li><code>ruby-prof<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>rb_add_event_hook<\/code> \u0437\u0434\u0435\u0441\u044c: <code>ruby-prof.c<\/code> <a href=\"https:\/\/github.com\/ruby-prof\/ruby-prof\/blob\/9465159ad4ac3dc97b607106bc7b09da3c629389\/ext\/ruby_prof\/ruby_prof.c#L329\">\u0441\u0442\u0440\u043e\u043a\u0430 329<\/a><\/li>\n<li><code>rblineprof<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>rb_add_event_hook<\/code> \u0437\u0434\u0435\u0441\u044c: <code>rblineprof.c<\/code> <a href=\"https:\/\/github.com\/tmm1\/rblineprof\/blob\/6030b7c696779bb733fc4101346975f8e5d13911\/ext\/rblineprof.c#L649\">\u0441\u0442\u0440\u043e\u043a\u0430 649<\/a><\/li>\n<\/ul>\n<p>   <\/p>\n<h3>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 tracing-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432<\/h3>\n<p>   \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c tracing-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0441 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f! \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u2014 \u043e\u0434\u043d\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0431\u0435\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f, \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e, \u044f \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>test.py<\/code> \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>python -mcProfile test.py<\/code> \u0438 <code>python test.py<\/code>. <code>python. test.py<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0437\u0430 0.6 \u0441, \u0430 <code>python -mcProfile test.py<\/code> \u2013 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0437\u0430 1 \u0441. \u0422\u0430\u043a \u0447\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 <code>cProfile<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 ~ 60% \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430.   <\/p>\n<blockquote><p>\u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <code>cProfile<\/code> \u0441\u043a\u0430\u0437\u0430\u043d\u043e:<br \/>   <i>\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u043f\u0440\u0438\u0440\u043e\u0434\u0430 Python \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445<\/i><\/p><\/blockquote>\n<p>   \u042d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u043c \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u2013 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 3,5 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e), \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043d\u0430 Python, \u0438 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430.<br \/>   \u042f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0430 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 <code>ruby-prof<\/code> (tracing-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 Ruby), \u043d\u043e \u0432 \u0435\u0433\u043e README \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:   <\/p>\n<blockquote><p><i>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u0434\u0432\u043e\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0432\u044b\u0441\u043e\u043a\u043e\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0442\u0435\u0441\u0442 \u0440\u044f\u0434\u0430 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438) \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435<\/i>.<\/p><\/blockquote>\n<p>   <\/p>\n<h3>\u041a\u0430\u043a \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b: setitimer<\/h3>\n<p>   \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432: sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430\u0445!<br \/>   \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432 Ruby \u0438 Python \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>setitimer<\/code>. \u0427\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435?<\/p>\n<p>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b 50 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\u041f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u044f\u0434\u0440\u043e Linux \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0430\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0435 20 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>setitimer<\/code>);<\/li>\n<li>\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0441\u043d\u0438\u043c\u043a\u0430 \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430;<\/li>\n<li>\u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c Linux \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0441\u043b\u0430\u0442\u044c \u0432\u0430\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442!<\/li>\n<\/ul>\n<p>   \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>setitimer<\/code> \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430, \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e <code><a href=\"https:\/\/github.com\/nylas\/nylas-perftools\/blob\/2e9f72ee74587e0dea5ba4826cd60a093c8869f0\/stacksampler.py\">stacksampler.py<\/a><\/code> \u2013 \u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2013 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440, \u0438 \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 100 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 Python. \u0418 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e!<\/p>\n<p>  \u041f\u0440\u0438\u0447\u0438\u043d\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 <code>stacksampler.py<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 100 \u0441\u0442\u0440\u043e\u043a \u0432 Python, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Python \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0442\u0435\u043a \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 <code>stacksampler.py<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"python\">def _sample(self, signum, frame):    stack = []    while frame is not None:        stack.append(self._format_frame(frame))        frame = frame.f_back     stack = ';'.join(reversed(stack))    self._stack_counts[stack] += 1<\/code><\/pre>\n<p>   \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0441\u0442\u0435\u043a \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0430 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0441\u044f. \u0422\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e! \u0422\u0430\u043a \u043a\u0440\u0443\u0442\u043e!<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <code>setitimer<\/code>, \u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043c, \u0433\u0434\u0435 \u0432 \u043a\u043e\u0434\u0435 \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 <code>setitimer<\/code>:<\/p>\n<ul>\n<li><code>stackprof<\/code> (Ruby): \u0432 <code>stackprof.c<\/code> <a href=\"https:\/\/github.com\/tmm1\/stackprof\/blob\/578043c0bc218509218134f9f91c21dab808c7ff\/ext\/stackprof\/stackprof.c#L118\">\u0441\u0442\u0440\u043e\u043a\u0430 118<\/a><\/li>\n<li><code>perftools.rb<\/code> (Ruby): \u0432 \u044d\u0442\u043e\u043c \u043f\u0430\u0442\u0447\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 <a href=\"https:\/\/github.com\/tmm1\/perftools.rb\/blob\/82122f4d47539483fd341c0c8f48cfe032580474\/patches\/perftools-objects.patch#L28\"><i>gem<\/i> \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d(?)<\/a><\/li>\n<li><code>stacksampler<\/code> (Python): <code>stacksampler.py<\/code> <a href=\"https:\/\/github.com\/nylas\/nylas-perftools\/blob\/2e9f72ee74587e0dea5ba4826cd60a093c8869f0\/stacksampler.py#L51\">\u0441\u0442\u0440\u043e\u043a\u0430 51<\/a><\/li>\n<li><code>statprof<\/code> (Python): <code>statprof.py<\/code> <a href=\"https:\/\/github.com\/bos\/statprof.py\/blob\/1a33eba91899afe17a8b752c6dfdec6f05dd0c01\/statprof.py#L239\">\u0441\u0442\u0440\u043e\u043a\u0430 239<\/a><\/li>\n<li><code>vmprof<\/code> (Python): <code>vmprof_unix.c<\/code> <a href=\"https:\/\/github.com\/vmprof\/vmprof-python\/blob\/660fda55c004033fac9fd27017af2450c6bd904f\/src\/vmprof_unix.c#L294\">\u0441\u0442\u0440\u043e\u043a\u0430 294<\/a><\/li>\n<\/ul>\n<p>   \u0412\u0430\u0436\u043d\u0430\u044f \u0432\u0435\u0449\u044c \u043e <code>setitimer<\/code> \u2014 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 20 \u043c\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438? 20 \u043c\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438? 20 \u043c\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e + \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430? \u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432\u044b\u0448\u0435, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u0438 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <code>setitimer<\/code> \u2013 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u0442. Man-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 <code><a href=\"http:\/\/man7.org\/linux\/man-pages\/man2\/setitimer.2.html\">setitimer<\/a><\/code> \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0438 \u0435\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  <code>@mgedmin<\/code> \u0432 <a href=\"https:\/\/twitter.com\/mgedmin\/status\/942789932128534528\">\u0442\u0432\u0438\u0442\u0442\u0435\u0440\u0435<\/a> \u0443\u043a\u0430\u0437\u0430\u043b \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>setitimer<\/code>. \u042d\u0442\u043e\u0442 <a href=\"https:\/\/github.com\/23andMe\/djdt-flamegraph\/issues\/4\">issue<\/a> \u0438 \u044d\u0442\u043e\u0442 <a href=\"https:\/\/github.com\/23andMe\/djdt-flamegraph\/issues\/5\">issue<\/a> \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.<\/p>\n<p>  \u041e\u0434\u0438\u043d \u0418\u041d\u0422\u0415\u0420\u0415\u0421\u041d\u042b\u0419 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>setitimer<\/code> \u2013 \u0442\u043e, \u0447\u0442\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u044b! \u0421\u0438\u0433\u043d\u0430\u043b\u044b \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b! \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0438\u043d\u043e\u0433\u0434\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434! \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u043d\u0438\u043c\u043a\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e!<\/p>\n<h3>Sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 setitimer<\/h3>\n<p>   \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e sampling-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <code>setitimer<\/code>:<\/p>\n<ul>\n<li><code>pyinstrument<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>PyEval_SetProfile<\/code> (\u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 tracing-\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440), \u043d\u043e \u043e\u043d \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043d\u0438\u043c\u043a\u0438 \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0430 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438. \u0412\u043e\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0441\u043d\u0438\u043c\u043a\u0430 <a href=\"https:\/\/github.com\/joerick\/pyinstrument\/blob\/15b94a63693837b97daea60e717ae835f77b7635\/pyinstrument\/profiler.py#L41-L45\">\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0442\u0435\u043a\u0430<\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 <a href=\"http:\/\/joerick.me\/posts\/2017\/12\/15\/pyinstrument-20\/\">\u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435<\/a>. (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c: <code>setitimer<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432 Python) <\/li>\n<li><code>pyflame<\/code> \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 Python \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>ptrace<\/code>. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0446\u0438\u043a\u043b, \u0433\u0434\u0435 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043d\u0438\u043c\u043a\u0438, \u0441\u043f\u0438\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0441\u043d\u043e\u0432\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435. <a href=\"https:\/\/github.com\/uber\/pyflame\/blob\/4a9c3dea4939261b0c1becb77ec700426aa1f2fb\/src\/prober.cc#L403\">\u0412\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435.<\/a><\/li>\n<li><code>python-flamegraph<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 Python \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0442\u0435\u043a\u0430, \u0441\u043f\u0438\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043d\u043e\u0432\u043e. <a href=\"https:\/\/github.com\/evanhempel\/python-flamegraph\/blob\/6b70f9068cb987a2b1942fbf048fc88a7a644c40\/flamegraph\/flamegraph.py#L73\">\u0412\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435<\/a>.<\/li>\n<\/ul>\n<p>   \u0412\u0441\u0435 3 \u044d\u0442\u0438 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430 \u0434\u0435\u043b\u0430\u044e\u0442 \u0441\u043d\u0438\u043c\u043a\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h3>\u041f\u043e\u0441\u0442\u044b \u0432 \u0431\u043b\u043e\u0433\u0435 pyflame<\/h3>\n<p>   \u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0430 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043d\u0430 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442 <code>pyflame<\/code>, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 Python \u0438\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0439 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 Ruby \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0432\u0441\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u044f \u043e\u043f\u0438\u0441\u0430\u043b\u0430. \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u042d\u0432\u0430\u043d \u041a\u043b\u0438\u0446\u043a\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043c\u043d\u043e\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u0441\u0432\u043e\u0435\u043c \u0431\u043b\u043e\u0433\u0435:<\/p>\n<ul>\n<li><a href=\"https:\/\/eng.uber.com\/pyflame\/\">Pyflame: Uber Engineering\u2019s Ptracing Profiler for Python<\/a> \u2014 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 pyflame;<\/li>\n<li><a href=\"https:\/\/eklitzke.org\/pyflame-dual-interpreter-mode\">Pyflame Dual Interpreter Mode<\/a> \u2014 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 Python 2 \u0438 Python 3 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e;<\/li>\n<li><a href=\"https:\/\/eklitzke.org\/an-unexpected-python-abi-change\">An Unexpected Python ABI Change<\/a> \u2014 \u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Python 3.6;<\/li>\n<li><a href=\"https:\/\/eklitzke.org\/dumping-multi-threaded-python-stacks\">Dumping Multi-Threaded Python Stacks<\/a>;<\/li>\n<li><a href=\"https:\/\/eklitzke.org\/pyflame-packages\">\u041f\u0430\u043a\u0435\u0442\u044b Pyflame<\/a>;<\/li>\n<li><a href=\"https:\/\/github.com\/eklitzke\/ptrace-syscall\"><code>\u041f\u0440\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 ptrace<\/code> \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0432 Python;<\/a><\/li>\n<li><a href=\"https:\/\/eklitzke.org\/ptrace-continued\">Using ptrace for fun and profit, ptrace (\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435)<\/a>;<\/li>\n<\/ul>\n<p>   \u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/eklitzke.org\/\">eklitzke.org<\/a>. \u0412\u0441\u0435 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, <code>ptrace<\/code> \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c <code>process_vm_readv<\/code> \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430 Ruby! \u0423 <code>process_vm_readv<\/code> \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0432\u0435\u0440\u0445\u0435\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u043e \u043e\u043d \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u0432\u0430\u043c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0441\u043d\u0438\u043c\u043e\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 :). \u0412 \u043c\u043e\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u043d\u043e \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0443 \u0441\u0435\u0440\u0438\u044e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  <b>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f!<\/b><\/p>\n<p>  \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0435 \u0432\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u2013 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e <code>vmprof<\/code> \u0438 <code>stacksampler<\/code> \u2013 \u0441\u0445\u043e\u0436\u0438 (\u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u2014 <code>vmprof<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Python, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 C, \u0447\u0442\u043e, \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c). \u041d\u043e \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439.<\/p>\n<hr>\n<p>  <a href=\"https:\/\/otus.pw\/uLfr\/\">TDD c pytest \u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e. \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0432\u0435\u0431\u0438\u043d\u0430\u0440<\/a><\/p>\n<hr>\n<p>  <\/p>\n<h2>\u0427\u0438\u0442\u0430\u0442\u044c \u0435\u0449\u0451:<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/502568\/\">5 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c Data Story<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/504102\/\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 Python Functools<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/511840\/\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c FastAPI \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441<\/a><\/li>\n<\/ul>\n<\/div>\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:\/\/habr.com\/ru\/company\/otus\/blog\/514132\/\"> https:\/\/habr.com\/ru\/company\/otus\/blog\/514132\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/514132\/\"><b><i>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430 <a href=\"https:\/\/otus.pw\/uLfr\/\">\u00ab\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a Python\u00bb<\/a>.<\/i><\/b><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hh\/kk\/fe\/hhkkfevorzftbmp9ukvvgv0bmos.png\"><\/p>\n<hr>\n<p>   \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043f\u0435\u0440\u0438\u0442\u0438\u0432\u0430 \u043a \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0443 \u043d\u0430 Ruby \u044f \u0445\u043e\u0442\u0435\u043b\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u043d\u0430 Ruby \u0438 Python. \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439: \u00ab\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440?\u00bb<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 (\u0430 \u043d\u0435, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438\/\u043a\u0443\u0447\u0438). \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u043a\u0430\u0436\u0443 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 Ruby \u0438 Python, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\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-308121","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/308121","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=308121"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/308121\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=308121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=308121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=308121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}