{"id":358450,"date":"2024-05-21T00:12:09","date_gmt":"2024-05-21T00:12:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=358450"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=358450","title":{"rendered":"<span>\u041a\u0430\u043a \u0432 180 000 \u0440\u0430\u0437 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Rust<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/769808\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/dm\/mb\/vj\/dmmbvjo4prkdwo8rmilimlu8or0.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/dm\/mb\/vj\/dmmbvjo4prkdwo8rmilimlu8or0.jpeg\" data-blurred=\"true\"\/><\/div>\n<p><\/a><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u0432\u043e\u0438\u0445 \u0434\u0435\u0440\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432 \u0441\u0444\u0435\u0440\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Rust. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0432\u044b \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0451\u043c\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 Rust. <a name=\"habracut\"><\/a><\/p>\n<p>  \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439: \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043d\u043b\u0430\u0439\u043d-\u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u043b\u0438 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u0412 \u0441\u044b\u0440\u043e\u043c \u0432\u0438\u0434\u0435 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">[ { \"user\": \"5ea2c2e3-4dc8-4a5a-93ec-18d3d9197374\", \"question\": \"7d42b17d-77ff-4e0a-9a4d-354ddd7bbc57\", \"score\": 1 }, { \"user\": \"b7746016-fdbf-4f8a-9f84-05fde7b9c07a\", \"question\": \"7d42b17d-77ff-4e0a-9a4d-354ddd7bbc57\", \"score\": 0 },  \/* ... \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 ... *\/ ]<\/code><\/pre>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0431\u044b\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a 0 \u043b\u0438\u0431\u043e 1.<\/p>\n<p>  \u0417\u0430\u0434\u0430\u0447\u0430: \u0434\u0430\u043d\u043e \u043d\u0435\u043a\u043e\u0435 <code>k<\/code>. \u041a\u0430\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437 <code>k<\/code> \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043e\u0431\u0449\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430? \u041d\u0430\u0437\u043e\u0432\u0451\u043c \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0435\u0439 k-CorrSet. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"bash\">func k_corrset($data, $k): $all_qs = all questions in $data for all $k-sized subsets $qs within $all_qs:   $us = all users that answered every question in $qs   $qs_totals = the total score on $qs of each user in $us   $grand_totals = the grand score on $all_qs of each user in $us   $r = correlation($qs_totals, $grand_totals)  return $qs with maximum $r <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041e\u0441\u043d\u043e\u0432\u0430 \u043d\u0430 Python<\/font><\/h2>\n<p>  \u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Python \u0438 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0436\u0443 \u043d\u0430 Rust, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438. \u0422\u0430\u043a \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f k-CorrSet, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a>:<\/p>\n<pre><code class=\"python\">from itertools import combinations import pandas as pd from pandas import IndexSlice as islice  def k_corrset(data, K):    all_qs = data.question.unique()    q_to_score = data.set_index(['question', 'user'])    all_grand_totals = data.groupby('user').score.sum().rename('grand_total')     corrs = []    for qs in combinations(all_qs, K):         qs_data = q_to_score.loc[islice[qs,:],:].swaplevel()         answered_all = qs_data.groupby(level=[0]).size() == K         answered_all = answered_all[answered_all].index         qs_totals = qs_data.loc[islice[answered_all,:]] \\               .groupby(level=[0]).sum().rename(columns={'score': 'qs'})         r = qs_totals.join(all_grand_totals).corr().qs.grand_total         corrs.append({'qs': qs, 'r': r})   corrs = pd.DataFrame(corrs)    return corrs.sort_values('r', ascending=False).iloc[0].qs  data = pd.read_json('scores.json') print(k_corrset(data, K=5))<\/code><\/pre>\n<p>  \u0412 \u043d\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u044f <a href=\"https:\/\/pandas.pydata.org\/docs\/user_guide\/advanced.html\">MultiIndex<\/a>, \u043d\u043e \u0434\u0435\u0442\u0430\u043b\u0438 \u043e\u043f\u0443\u0441\u0442\u0438\u043c. \u0421\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u043d\u0451\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0435. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u043c, \u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443. \u0412\u043e\u0442 \u0435\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438:<\/p>\n<ul>\n<li>60,000 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439;<\/li>\n<li>200 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432;<\/li>\n<li>20% \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u043e 12,000 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439);<\/li>\n<li>\u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u043b \u043c\u043e\u0436\u0435\u0442 \u0441 \u0440\u0430\u0432\u043d\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u044b\u0442\u044c 1 \u0438\u043b\u0438 0.<\/li>\n<\/ul>\n<p>  \u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2013 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 k-CorrSet \u043f\u0440\u0438 <code>k=5<\/code> \u043d\u0430 \u043c\u043e\u0451\u043c M1 MacBook Pro 2021 \u0433\u043e\u0434\u0430 \u0437\u0430 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 2,5 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u0440\u0443\u0442\u0444\u043e\u0440\u0441\u0430 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440. <\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e Python <code><a href=\"https:\/\/docs.python.org\/3\/library\/time.html#time.time\">time.time()<\/a><\/code>, \u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438 1,000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 CPython 3.9.17. \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e 36 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0435\u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0431\u0449\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0443\u0439\u0434\u0451\u0442 2,9 \u0433\u043e\u0434\u0430. \u041d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c!<\/p>\n<blockquote><p><i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/i>: \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 Python, \u043d\u043e \u043c\u043e\u044f \u0446\u0435\u043b\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043d\u0435 \u0432\u044b\u0441\u043e\u043a\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 Python \u0441 \u0432\u044b\u0441\u043e\u043a\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c Rust, \u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u00ab\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0430 Jupyter\u00bb \u0432 Python \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0435\u0433\u043e \u0432\u044b\u0441\u043e\u043a\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043e\u0439 \u043d\u0430 Rust.<\/p><\/blockquote>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0432 Rust<\/font><\/h2>\n<p>  \u041d\u0430\u0447\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 Python \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Rust. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0437\u0430 \u0441\u0447\u0451\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 Rust. \u0412 \u0446\u0435\u043b\u044f\u0445 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u044f \u0431\u0443\u0434\u0443 \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>#[derive]<\/code> \u0432 \u0442\u0438\u043f\u0430\u0445 \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u0432 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412\u0435\u0441\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/willcrichton\/corrset-benchmark\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 GitHub<\/a>.<\/p>\n<p>  \u0421\u043f\u0435\u0440\u0432\u0430 \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043c \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"rust\">pub struct User(pub String);  pub struct Question(pub String);  pub struct Row {     pub user: User,     pub question: Question,     pub score: u32, }<\/code><\/pre>\n<p>  \u041c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c <code>User<\/code> \u0438 <code>Question<\/code> \u0432 \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u044f\u0441\u043d\u043e\u0441\u0442\u0438, \u0438 \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0438\u0445 \u0442\u0440\u0435\u0439\u0442\u044b. \u0417\u0430\u0442\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c k-CorrSet \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">fn k_corrset(data: &amp;[Row], k: usize) -> Vec&lt;&amp;Question> {   \/\/ utils::group_by(impl Iterator&lt;Item = (K1, K2, V)>)    \/\/   -> HashMap&lt;K1, HashMap&lt;K2, V>>;   let q_to_score: HashMap&lt;&amp;Question, HashMap&lt;&amp;User, u32>> =      utils::group_by(data.iter().map(|r| (&amp;r.question, &amp;r.user, r.score)));   let u_to_score: HashMap&lt;&amp;User, HashMap&lt;&amp;Question, u32>> =      utils::group_by(data.iter().map(|r| (&amp;r.user, &amp;r.question, r.score)));   let all_grand_totals: HashMap&lt;&amp;User, u32> =      u_to_score.iter().map(|(user, scores)| {       let total = scores.values().sum::&lt;u32>();       (*user, total)     })     .collect();    let all_qs = q_to_score.keys().copied();   all_qs.combinations(k)     .filter_map(|qs: Vec&lt;&amp;Question>| {       let (qs_totals, grand_totals): (Vec&lt;_>, Vec&lt;_>) = all_grand_totals.iter()         .filter_map(|(u, grand_total)| {           let q_total = qs.iter()             .map(|q| q_to_score[*q].get(u).copied())             .sum::&lt;Option&lt;u32>>()?;           Some((q_total as f64, *grand_total as f64))         })         .unzip();       \/\/ utils::correlation(&amp;[f64], &amp;[f64]) -> f64;       let r = utils::correlation(&amp;qs_totals, &amp;grand_totals);       (!r.is_nan()).then_some((qs, r))     })     .max_by_key(|(_, r)| FloatOrd(*r))     .unwrap().0 }<\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c:<\/p>\n<ul>\n<li>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 Python, \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>utils::group_by<\/code>. (\u0418\u043c\u0435\u0439\u0442\u0435 \u0432\u0432\u0438\u0434\u0443, \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c <code>HashMap<\/code>, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u043c \u0434\u043b\u044f <code><a href=\"https:\/\/docs.rs\/fxhash\/0.2.1\/fxhash\/type.FxHashMap.html\">fxhash::FxHashMap<\/a><\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e <code><a href=\"https:\/\/doc.rust-lang.org\/stable\/std\/collections\/struct.HashMap.html\">std::collections::HashMap<\/a><\/code> \u0441 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code><a href=\"https:\/\/docs.rs\/itertools\/0.11.0\/itertools\/trait.Itertools.html#method.combinations\">Itertools::combinations<\/a><\/code>.<\/li>\n<li>\u0412\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c <code>all_grand_totals.iter()<\/code>.<\/li>\n<li>\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>q_to_score[*q].get(u).copied()<\/code> \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>Option&lt;u32 ><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Some(n)<\/code>, \u0435\u0441\u043b\u0438 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u0431\u0430\u043b\u043b \u0434\u043b\u044f <code>q<\/code>, \u0438 <code>None<\/code> \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/li>\n<li>\u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440 <code>.sum::&lt;Option&lt;u32>>()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Some(total)<\/code>, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u043d\u0430 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 <code>qs<\/code>, \u0438 <code>None<\/code> \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/li>\n<li>\u041c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>utils::correlation<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Pearson_correlation_coefficient\">\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u041f\u0438\u0440\u0441\u043e\u043d\u0430<\/a>.<\/li>\n<li>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>max_by_key<\/code> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0441 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code><a href=\"https:\/\/docs.rs\/float-ord\/0.3.2\/float_ord\/struct.FloatOrd.html\">FloatOrd<\/a><\/code>, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439.<\/li>\n<\/ul>\n<p>  \u0418 \u043a\u0430\u043a\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c? \u0414\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 (<code>filter_map<\/code>) \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/bheisler.github.io\/criterion.rs\/book\/index.html\">Criterion<\/a> \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0432\u0437\u044f\u0432 \u0442\u043e\u0442 \u0436\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442. \u041d\u043e\u0432\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 4,2 \u043c\u0441, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 8 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 Python-\u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u043e \u043d\u0430 \u043e\u0431\u0449\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 124 \u0434\u043d\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e. \u041f\u043e\u0440\u0430 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/font><\/h2>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0434\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0433\u0434\u0435 \u0432 \u043d\u0451\u043c \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430. \u041d\u0430 \u0441\u0432\u043e\u0451\u043c Mac \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Instruments_(software)\">Instruments.app<\/a>, \u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b <a href=\"https:\/\/github.com\/mstange\/samply\/\">samply<\/a> \u0438 \u0431\u044b\u043b \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0443\u0434\u0438\u0432\u043b\u0451\u043d! \u041e\u043d \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e samply \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 Rust \u043a\u0430\u043a \u0432 \u043f\u043b\u0430\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (demangling), \u0442\u0430\u043a \u0438 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u0412\u043e\u0442 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0440\u0435\u0439\u0441\u0430 samply \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Rust:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yu\/cx\/7z\/yucx7zknhaqxu9xdoqdv8ohmn1g.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yu\/cx\/7z\/yucx7zknhaqxu9xdoqdv8ohmn1g.png\"\/><\/p>\n<p>  \u041e\u043a\u043e\u043b\u043e 75% \u0432\u0441\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0432 <code>HashMap::get<\/code>! \u0410 \u0432\u043e\u0442 \u0438 \u0432\u0438\u043d\u043e\u0432\u043d\u0430\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0430 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"rust\">q_to_score[*q].get(u).copied()<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u044d\u0448\u0438\u0440\u0443\u0435\u043c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c 36-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 UUID, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\/\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 <code>Vec<\/code> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\/\u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0432 \u044d\u0442\u043e\u043c <code>Vec<\/code>. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b <code>usize<\/code> \u0441 \u0442\u0438\u043f\u043e\u043c <code>Vec<\/code>, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u041f\u043e \u0444\u0430\u043a\u0442\u0443 \u0432 \u043c\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e, \u0447\u0442\u043e \u044f \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u043b\u044f \u043d\u0435\u0451 \u043a\u0440\u0435\u0439\u0442, <a href=\"https:\/\/docs.rs\/indexical\/0.6.0\/indexical\/index.html\">Indexical<\/a>, \u0432\u0437\u044f\u0432 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u043a\u0440\u0435\u0439\u0442 <code><a href=\"https:\/\/docs.rs\/index_vec\/0.1.3\/index_vec\/index.html\">index_vec<\/a><\/code>. <\/p>\n<p>  \u042d\u0442\u0438 \u0442\u0438\u043f\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">pub struct QuestionRef&lt;'a>(pub &amp;'a Question); pub struct UserRef&lt;'a>(pub &amp;'a User);  define_index_type! {   pub struct QuestionIdx for QuestionRef&lt;'a> = u16; }  define_index_type! {   pub struct UserIdx for UserRef&lt;'a> = u32; }<\/code><\/pre>\n<p>  <code>QuestionRef<\/code> \u0438 <code>UserRef<\/code> \u2013 \u044d\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u0442\u044b \u0432 <code>&amp;Question<\/code> \u0438 <code>&amp;User<\/code>. \u041c\u0430\u043a\u0440\u043e\u0441 <code>define_index_type<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0430 <code>QuestionIdx<\/code> \u0438 <code>UserIdx<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 <code>QuestionRef<\/code> \u0438 <code>UserRef<\/code>. \u042d\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u0430\u043a <code>u16<\/code> \u0438 <code>u32<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c <code>k_corrset<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code><a href=\"https:\/\/docs.rs\/indexical\/0.6.0\/indexical\/struct.IndexedDomain.html\">IndexedDomain<\/a><\/code> \u0434\u043b\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0438\u043f\u044b <code>QuestionIdx<\/code> \u0438 <code>UserIdx<\/code>:<\/p>\n<pre><code class=\"rust\">fn k_corrset(data: &amp;[Row], k: usize) -> Vec&lt;&amp;Question> {   \/\/ \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u043c `IndexedDomain` \u0434\u043b\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   let (questions_set, users_set): (HashSet&lt;_>, HashSet&lt;_>) = data.iter()     .map(|row| (QuestionRef(&amp;row.question), UserRef(&amp;row.user)))     .unzip();   let questions = IndexedDomain::from_iter(questions_set);   let users = IndexedDomain::from_iter(users_set);  \/\/ \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0435 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e \u0438 \u0440\u0430\u043d\u044c\u0448\u0435,  \/\/ \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f `IndexedDomain::index` \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432. \/\/ \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0442\u0438\u043f\u0430\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 HashMap.   let q_to_score: HashMap&lt;QuestionIdx, HashMap&lt;UserIdx, u32>> =      utils::group_by(data.iter().map(|r| (       questions.index(&amp;(QuestionRef(&amp;r.question))),       users.index(&amp;(UserRef(&amp;r.user))),       r.score,     )));   let u_to_score: HashMap&lt;UserIdx, HashMap&lt;QuestionIdx, u32>> =      utils::group_by(data.iter().map(|r| (       users.index(&amp;(UserRef(&amp;r.user))),       questions.index(&amp;(QuestionRef(&amp;r.question))),       r.score,     )));     let all_grand_totals = \/\/ same code    let all_qs = questions.indices();   all_qs.combinations(k)     .filter_map(|qs: Vec&lt;QuestionIdx>| {       \/\/ \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434.     })     .max_by_key(|(_, r)| FloatOrd(*r))     .unwrap().0     \/\/ \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.     .into_iter().map(|idx| questions.value(idx).0).collect() }<\/code><\/pre>\n<p>  \u0412\u0441\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/willcrichton\/corrset-benchmark\/blob\/main\/src\/inner\/indexed.rs\">GitHub<\/a>. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f API \u043a\u0440\u0435\u0439\u0442\u0430 Indexical, \u0442\u043e \u043e\u043d \u043e\u043f\u0438\u0441\u0430\u043d \u0432 <a href=\"https:\/\/docs.rs\/indexical\/0.6.0\/indexical\/index.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 1,0 \u043c\u0441, \u0447\u0442\u043e \u0432 4 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0432 35 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u0430\u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u043e\u0439. \u0418\u0442\u043e\u0433\u043e \u043d\u0430 \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0443\u0439\u0434\u0451\u0442 \u0443\u0436\u0435 30 \u0434\u043d\u0435\u0439 \u2013 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c!<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439<\/font><\/h2>\n<p>  \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wk\/qi\/_e\/wkqi_eiezor64xiuuftnp1utrbe.png\" data-src=\"https:\/\/habrastorage.org\/webt\/wk\/qi\/_e\/wkqi_eiezor64xiuuftnp1utrbe.png\"\/><\/p>\n<p>  \u041d\u0430\u0434\u043e \u0436\u0435, \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0431\u043e\u0301\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0432 <code>HashMap::get<\/code>. \u0410 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446? <code>HashMap&lt;&amp;User, u32><\/code> \u2013 \u044d\u0442\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 <code>Vec&lt;Option&lt;u32>><\/code>, \u0433\u0434\u0435 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>&amp;User<\/code> \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 <code>[\"a\", \"b\", \"c\"]<\/code> \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>{\"b\" => 1}<\/code> \u0440\u0430\u0432\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0443 <code>[None, Some(1), None]<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0438\u0437-\u0437\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 <code>None<\/code>), \u043d\u043e \u043e\u043d \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  \u041c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0440\u0430\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Indexical, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0438\u043f <code><a href=\"https:\/\/docs.rs\/indexical\/0.6.0\/indexical\/map\/struct.DenseIndexMap.html\">DenseIndexMap&lt;K, V><\/a><\/code>, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u0430\u043a <code>Vec&lt;V><\/code> \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c <code>K::Index<\/code>.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>k_corrset<\/code> \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0436\u0430\u0442\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u044b:<\/p>\n<pre><code class=\"rust\">pub type QuestionMap&lt;'a, T> = DenseIndexMap&lt;'a, QuestionRef&lt;'a>, T>; pub type UserMap&lt;'a, T> = DenseIndexMap&lt;'a, UserRef&lt;'a>, T>;  fn k_corrset(data: &amp;[Row], k: usize) -> Vec&lt;&amp;Question> {  \/\/ \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 `users` \u0438 `questions`.  \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c q_to_score \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0436\u0430\u0442\u0443\u044e \u043a\u0430\u0440\u0442\u0443.   let mut q_to_score: QuestionMap&lt;'_, UserMap&lt;'_, Option&lt;u32>>> =      QuestionMap::new(&amp;questions, |_| UserMap::new(&amp;users, |_| None));      \/\/ \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c q_to_score \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u043c.   for r in data {     q_to_score       .get_mut(&amp;QuestionRef(&amp;r.question))       .unwrap()       .insert(UserRef(&amp;r.user), Some(r.score));   }    let grand_totals = UserMap::new(&amp;users, |u| {     q_to_score.values().filter_map(|v| v[u]).sum::&lt;u32>()   });    let all_qs = questions.indices();   all_qs.combinations(k)     \/\/ \u043f\u043e\u0447\u0442\u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u0441\u043c. \u043d\u0438\u0436\u0435 }<\/code><\/pre>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">q_to_score[*q].get(u).copied()<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">q_to_score[*q][u]<\/code><\/pre>\n<p>  \u041f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 181 \u043c\u043a\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 6 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0432 199 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 Python-\u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043e 5,3 \u0434\u043d\u044f.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0433\u0440\u0430\u043d\u0438\u0446<\/font><\/h2>\n<p>  \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0443\u0434\u0430\u0440 \u043f\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u043d\u0430\u043d\u043e\u0441\u0438\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043e\u043a \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>DenseIndexMap<\/code>. \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0433\u0440\u0430\u043d\u0438\u0446, \u043d\u043e \u043d\u0430\u0448 \u043a\u043e\u0434 \u0432 \u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u042f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 samply, \u043d\u043e \u043e\u043d\u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0435\u0451 \u0441\u0442\u043e\u0438\u0442 \u0443\u0431\u0440\u0430\u0442\u044c. <\/p>\n<p>  \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0448 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">let q_total = qs.iter()   .map(|q| q_to_score[*q][u])   .sum::&lt;Option&lt;u32>>()?; let grand_total = all_grand_totals[u];<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>get_unchecked<\/code> \u043d\u0430\u0448 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u043d\u044f\u043b \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"rust\">let q_total = qs.iter()   .map(|q| unsafe {     let u_scores = q_to_score.get_unchecked(q);     *u_scores.get_unchecked(u)   })   .sum::&lt;Option&lt;u32>>()?; let grand_total = unsafe { *all_grand_totals.get_unchecked(u) };<\/code><\/pre>\n<p>  \u0411\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0446\u0438\u043a\u043b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0431\u043b\u043e\u043a\u0438 \u043a\u0430\u043a <code>unsafe<\/code>.<\/p>\n<p>  \u041f\u0440\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 156 \u043c\u043a\u0441, \u0447\u0442\u043e \u0432 1,16 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438 \u0432 229 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 Python-\u0432\u0435\u0440\u0441\u0438\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 4,6 \u0434\u043d\u044f.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0411\u0438\u0442\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b<\/font><\/h2>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0432 225 \u0440\u0430\u0437, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u043c \u0435\u0449\u0451 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u0442\u0440\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430.<\/p>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d, \u043f\u043e \u0441\u0443\u0442\u0438, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">for each subset of questions $qs:   for each user $u:     for each question $q in $qs:       if $u answered $q: add $u's score on $q to a running total       else: skip to the next user     $r = correlation($u's totals on $qs, $u's grand total)<\/code><\/pre>\n<p>  \u0412\u0430\u0436\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u0440\u0430\u0437\u0440\u0435\u0436\u0451\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443. \u041d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0432\u0437\u044f\u0442\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043b\u0438\u0448\u044c 20% \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u0430\u043b\u0438 \u043e\u0442\u0432\u0435\u0442. \u0415\u0441\u043b\u0438 \u0431\u0440\u0430\u0442\u044c 5 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0442\u043e \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442 \u0434\u0430\u043b\u043e \u0435\u0449\u0451 \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043b\u044e\u0434\u0435\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438 \u043d\u0430 \u0432\u0441\u0435 5 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0442\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0446\u0438\u043a\u043b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 (\u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439). \u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre><code class=\"rust\">for each subset of questions $qs:   $qs_u = all users who have answered every question in $qs   for each user $u in $qs_u:     for each question $q in $qs:       add $u's score on $q to a running total     $r = correlation($u's scores on $qs, $u's grand total)<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043e\u0442\u0432\u0435\u0442\u0438\u0432\u0448\u0438\u0445 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441? \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code><a href=\"https:\/\/doc.rust-lang.org\/std\/collections\/struct.HashSet.html\">HashSet<\/a><\/code>, \u043d\u043e \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bit_array\">\u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. Indexical \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430: <code><a href=\"https:\/\/docs.rs\/indexical\/0.6.0\/indexical\/struct.IndexSet.html\">IndexSet<\/a><\/code>.<\/p>\n<p>  \u0420\u0430\u043d\u0435\u0435 \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 <code>q_to_score<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0431\u0430\u043b\u043b\u043e\u0432 (\u0442\u043e \u0435\u0441\u0442\u044c, <code>UserMap&lt;'_, Option&lt;u32>><\/code>). \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043c <code>Option&lt;u32><\/code> \u043d\u0430 <code>u32<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043e\u0442\u0432\u0435\u0442\u0438\u0432\u0448\u0438\u0445 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u041f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">type UserSet&lt;'a> = IndexSet&lt;'a, UserRef&lt;'a>>;  let mut q_to_score: QuestionMap&lt;'_, (UserSet&lt;'_>, UserMap&lt;'_, u32>)> =    QuestionMap::new(&amp;questions, |_| (     UserMap::&lt;'_, u32>::new(&amp;users, |_| 0),     UserSet::new(&amp;users),   )); for r in data {   let (scores, set) = &amp;mut q_to_score.get_mut(&amp;QuestionRef(&amp;r.question)).unwrap();   scores.insert(UserRef(&amp;r.user), r.score);   set.insert(UserRef(&amp;r.user)); }<\/code><\/pre>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e <code>q_to_score<\/code> \u0442\u0435\u043f\u0435\u0440\u044c, \u043f\u043e \u0441\u0443\u0442\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <code>0<\/code> \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0435\u0440\u0435\u0433\u0430\u0442\u044c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043d\u043e\u0432\u043e\u043c\u0443 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"rust\">let all_qs = questions.indices(); all_qs.combinations(k)   .filter_map(|qs: Vec&lt;QuestionIdx>| {     \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430.     let mut users = q_to_score[qs[0]].1.clone();     for q in &amp;qs[1..] {       users.intersect(&amp;q_to_score[*q].1);     }      let (qs_totals, grand_totals): (Vec&lt;_>, Vec&lt;_>) = users.indices()       \/\/ \u0442\u043e\u043b\u044c\u043a\u043e .map, \u0430 \u043d\u0435 .filter_map, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435.       .map(|u| {         let q_total = qs.iter()                     .map(|q| unsafe {             let (u_scores, _) = q_to_score.get_unchecked(q);             *u_scores.get_unchecked(u)           })           \/\/ \u0442\u043e\u043b\u044c\u043a\u043e u32, \u0430 \u043d\u0435 Option&lt;u32>, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435.           .sum::&lt;u32>();         let grand_total = unsafe { *all_grand_totals.get_unchecked(u) };         (q_total as f64, grand_total as f64)       })       .unzip();     let r = utils::correlation(&amp;qs_totals, &amp;grand_totals);     (!r.is_nan()).then_some((qs, r))   })   \/\/ \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u0434 \u043f\u0440\u0435\u0436\u043d\u0438\u0439.<\/code><\/pre>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 47 \u043c\u043a\u0441 \u2013 \u0442\u043e \u0435\u0441\u0442\u044c \u0432 3,4 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438 \u0432 769 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Python. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0438 \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043e 1,4 \u0434\u043d\u044f.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d SIMD<\/font><\/h2>\n<p>  \u041d\u043e\u0432\u0430\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u0432\u0441\u0451 \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0430, \u043d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e samply:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qi\/pk\/y8\/qipky8jqfyd26tzyalk8fot36kq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qi\/pk\/y8\/qipky8jqfyd26tzyalk8fot36kq.png\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0434 \u0432\u0441\u0451 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0437\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0430\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u043a\u0430\u0440\u0442\u0430\u043c\u0438 Indexical \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/docs.rs\/bitvec\/1.0.1\/bitvec\/index.html\">bitvec<\/a>. \u041d\u0430 2023 \u0433\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>intersect<\/code> \u0432 \u043d\u0435\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">fn intersect(dst: &amp;mut BitSet, src: &amp;BitSet) {   for (n1, n2): (&amp;mut u64, &amp;u64) in dst.iter_mut().zip(&amp;src) {     *n1 &amp;= *n2;   } }<\/code><\/pre>\n<p>  \u0417\u043d\u0430\u0447\u0438\u0442, bitvec \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <code>AND<\/code> \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>u64<\/code> \u0437\u0430 \u0440\u0430\u0437. \u041d\u043e, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single_instruction,_multiple_data\">SIMD<\/a> (Single Instruction stream, Multiple Data stream, \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u2013 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445), \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0431\u0438\u0442\u0430\u043c\u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 <code>u64<\/code> \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432 Rust \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 API SIMD <code><a href=\"https:\/\/doc.rust-lang.org\/std\/simd\/index.html\">std::simd<\/a><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u0435\u0440\u0441\u0438\u044f SIMD \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">fn intersect(dst: &amp;mut SimdBitSet, src: &amp;SimdBitSet) {   for (n1, n2): (&amp;mut u64x4, &amp;u64x4) in dst.iter_mut().zip(&amp;src) {     *n1 &amp;= *n2;   } }<\/code><\/pre>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f <code>u64<\/code> \u0442\u0438\u043f\u043e\u043c SIMD <code><a href=\"https:\/\/doc.rust-lang.org\/std\/simd\/type.u64x4.html\">u64x4<\/a><\/code>, \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435 Rust \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e SIMD \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>&amp;=<\/code>, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0447\u0435\u0442\u044b\u0440\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>u64<\/code> \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p>  \u0410 \u0433\u0434\u0435 \u043d\u0430\u043c \u0432\u0437\u044f\u0442\u044c <code>BitSet<\/code>, \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SIMD? <a href=\"https:\/\/docs.rs\/bitvec\/1.0.1\/bitvec\/index.html\">Bitvec<\/a> \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 SIMD. \u041d\u0430 <a href=\"https:\/\/crates.io\/\">crates.io<\/a> \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0438 \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/psiace\/bitsvec\">bitsvec<\/a>. \u0414\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u044d\u0442\u043e\u043c \u043a\u0440\u0435\u0439\u0442\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u043e\u0438\u0441\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0431\u0438\u0442\u043e\u0432 1, \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 bitsvec \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/willcrichton\/indexical\/blob\/913fbf5830f4d5acedd23e04841e453ed2659165\/src\/bitset\/simd.rs\">\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 Indexical<\/a>. <\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u043c Indexical, \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SIMD, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0442\u0438\u043f\u043e\u0432 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>k_corrset<\/code>. \u042f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u043b\u0438\u043d\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0438 \u043d\u0430 \u043c\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u044d\u0442\u0438\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u043c \u0441\u0430\u043c\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f <code>u64x16<\/code>.<\/p>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u0438 \u043d\u0430\u0448 \u0446\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 1,35 \u043c\u043a\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 34 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0432 26,459 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u0430\u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u043e\u0439. \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0434\u043e 57 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/font><\/h2>\n<p>  \u041c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043b\u0438\u0441\u044c \u043a \u043f\u0438\u043a\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. (\u0412\u0430\u043c \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u043d\u043e\u2026) \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u044b \u0441\u0430\u043c\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u0430\u0445 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sf\/z4\/p3\/sfz4p3wxms56ajdzbgrwl9aproi.png\" data-src=\"https:\/\/habrastorage.org\/webt\/sf\/z4\/p3\/sfz4p3wxms56ajdzbgrwl9aproi.png\"\/><\/p>\n<p>  \u0421\u0430\u043c\u043e\u0435 \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u2013 \u044d\u0442\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442. \u0421\u0435\u0440\u044c\u0451\u0437\u043d\u043e! \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: <code>memmove<\/code>, <code>realloc<\/code>, <code>allocate<\/code> \u2014 \u0432\u0441\u0451 \u0432\u0435\u0440\u043d\u043e, \u043c\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u044c. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c, \u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f <code>qs_totals<\/code> \u0438 <code>grand_totals<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>unzip<\/code>.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0438 \u0437\u0430\u0442\u0435\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0432 \u043d\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044c:<\/p>\n<pre><code class=\"rust\">\/\/ \u0437\u0430\u0431\u043b\u0430\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. let mut qs_totals = vec![0.; users.len()] let mut grand_totals = vec![0.; users.len()]; let mut user_set = IndexSet::new(&amp;users);  let all_qs = questions.indices(); all_qs.combinations(k)   .filter_map(|qs| {     \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c `clone_from` \u0432\u043c\u0435\u0441\u0442\u043e `clone`, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0435\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f.     user_set.clone_from(&amp;q_to_score[qs[0]].1);     for q in &amp;qs[1..] {       user_set.intersect(&amp;q_to_score[*q].1);     }      let mut n = 0;     for (i, u) in user_set.indices().enumerate() {       let q_total = qs.iter()         .map(|q| unsafe {           let (u_scores, _) = q_to_score.get_unchecked(q);           *u_scores..get_unchecked(u)         })         .sum::&lt;u32>();       let grand_total = unsafe { *all_grand_totals.get_unchecked(u) };        \/\/ \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c totals\/grand_totals \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440.       unsafe {         *qs_totals.get_unchecked_mut(i) = q_total as f64;         *grand_totals.get_unchecked_mut(i) = grand_total as f64;       }        n += 1;     }      \/\/ \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 `n` \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432!     let r = utils::correlation(&amp;qs_totals[..n], &amp;grand_totals[..n]);     (!r.is_nan()).then_some((qs, r))   })<\/code><\/pre>\n<p>  \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0441\u044f \u0434\u043e 1,09 \u043c\u043a\u0441, \u0447\u0442\u043e \u0432 1,24 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0432 32,940 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u043d\u0430 Python. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043e\u0431\u0449\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0443\u0439\u0434\u0451\u0442 \u0432\u0441\u0435\u0433\u043e 46 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<p>  \u0412\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u0443\u0447\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440 \u0438 \u043f\u043e\u0432\u043b\u0438\u044f\u043b \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 1 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0432\u043e\u0434\u043a\u0430, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430.<\/p>\n<p>  \u0422\u0430\u0431\u043b\u0438\u0446\u0430 1: \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tbody>\n<tr>\n<td>\u0423\u0440\u043e\u0432\u0435\u043d\u044c<\/td>\n<td>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/td>\n<td>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f<\/td>\n<td>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e Python<\/td>\n<td>\u041e\u0446\u0435\u043d\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f<\/td>\n<\/tr>\n<tr>\n<td>Python <\/td>\n<td>35.85 \u043c\u0441<\/td>\n<td>1.00\u00d7<\/td>\n<td><\/td>\n<td>2.88 \u043b\u0435\u0442<\/td>\n<\/tr>\n<tr>\n<td>0_basic <\/td>\n<td>4.24 \u043c\u0441<\/td>\n<td>8.46\u00d7<\/td>\n<td>8.46\u00d7<\/td>\n<td>124.40 \u0434\u043d\u044f<\/td>\n<\/tr>\n<tr>\n<td>1_indexed <\/td>\n<td>1.03 \u043c\u0441<\/td>\n<td>4.11\u00d7<\/td>\n<td>34.78\u00d7<\/td>\n<td>30.25 \u0434\u043d\u044f<\/td>\n<\/tr>\n<tr>\n<td>2_imap <\/td>\n<td>180.52 \u043c\u043a\u0441<\/td>\n<td>5.71\u00d7<\/td>\n<td>198.60\u00d7<\/td>\n<td>5.30 \u0434\u043d\u044f<\/td>\n<\/tr>\n<tr>\n<td>3_bchecks <\/td>\n<td>156.23 \u043c\u043a\u0441<\/td>\n<td>1.16\u00d7<\/td>\n<td>229.47\u00d7<\/td>\n<td>4.59 \u0434\u043d\u044f<\/td>\n<\/tr>\n<tr>\n<td>4_bitset <\/td>\n<td>46.60 \u043c\u043a\u0441<\/td>\n<td>3.35\u00d7<\/td>\n<td>769.26\u00d7<\/td>\n<td>1.37 \u0434\u043d\u044f<\/td>\n<\/tr>\n<tr>\n<td>5_simd <\/td>\n<td>1.35 \u043c\u043a\u0441<\/td>\n<td>34.40\u00d7<\/td>\n<td>26,459.54\u00d7<\/td>\n<td>57.26 \u043c\u0438\u043d<\/td>\n<\/tr>\n<tr>\n<td>6_alloc <\/td>\n<td>1.09 \u043c\u043a\u0441<\/td>\n<td>1.24\u00d7<\/td>\n<td>32,940.02\u00d7<\/td>\n<td>45.99 \u043c\u0438\u043d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  \u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0441\u044c y \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wv\/yf\/xm\/wvyfxm3x_uasfrwfxm2thaiwrek.png\" data-src=\"https:\/\/habrastorage.org\/webt\/wv\/yf\/xm\/wvyfxm3x_uasfrwfxm2thaiwrek.png\"\/><br \/>  <i><font color=\"#999999\">\u0422\u0440\u0435\u043d\u0434 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430<\/font><\/i><\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c<\/font><\/h2>\n<p>  \u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043c\u044b, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430. \u041b\u0438\u0447\u043d\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0435\u0449\u0451 \u043f\u0440\u0438\u0451\u043c\u044b \u0434\u043b\u044f \u043e\u0449\u0443\u0442\u0438\u043c\u043e\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u2013 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0451\u0442. \u041d\u043e \u0443 \u043d\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u0438\u043d, \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439, \u043f\u0440\u0438\u0451\u043c \u2013 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u044f\u0434\u0440\u0430\u043c. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/rayon\/1.8.0\/rayon\/index.html\">Rayon<\/a> \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437:<\/p>\n<pre><code class=\"rust\">let all_qs = questions.indices(); all_qs.combinations(k)   .par_bridge()   .map_init(     || (vec![0.; users.len()], vec![0.; users.len()], IndexSet::new(&amp;users)),     |(qs_totals, grand_totals, user_set), qs| {       \/\/ \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434     })     \/\/ \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434<\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 <code>par_bridge<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>map_init<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0431\u0435\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f. <\/p>\n<p>  \u0414\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a. \u042f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u044d\u0442\u043e\u0442 \u0446\u0438\u043a\u043b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 5,000,000 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430 \u0440\u0430\u0437 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Criterion, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u042d\u0442\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u0431\u0435\u0437 \u043c\u043d\u043e\u0433\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430.<\/p>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 6,8 \u0441\u0435\u043a\u0443\u043d\u0434. \u0412 \u043c\u043e\u0451\u043c MacBook Pro 10 \u044f\u0434\u0435\u0440, \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Rayon \u043c\u043e\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 10-\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043b\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u044d\u0442\u043e\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 4,2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 5,000,000 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439. \u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u0432\u0441\u0435\u0433\u043e 1,6 \u0440\u0430\u0437\u0430. \u041f\u043e\u0437\u043e\u0440!<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/font><\/h2>\n<p>  \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/9v\/d6\/g8\/9vd6g8xe6fi71_rdkqnrcixn3ey.png\" data-src=\"https:\/\/habrastorage.org\/webt\/9v\/d6\/g8\/9vd6g8xe6fi71_rdkqnrcixn3ey.png\"\/><\/p>\n<p>  \u041d\u0430\u0448\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u043e\u0301\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u0437\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c <a href=\"https:\/\/docs.rs\/rayon\/1.8.0\/rayon\/iter\/trait.ParallelBridge.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a> \u043a <code>par_bridge<\/code>, \u0442\u043e \u043c\u044b \u043d\u0430\u0439\u0434\u0451\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<blockquote><p>\u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>next()<\/code> \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043f\u0435\u0432\u0430\u0442\u044c \u0437\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u0440\u043e\u0441\u043e\u043c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p><\/blockquote>\n<p>  \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043c\u0435\u0436\u0434\u0443 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c <code>Itertools::combinations<\/code> \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0441\u0442\u043e\u043c Rayon \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439, \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043a\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043f\u043e\u0442\u043e\u043a \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u043d\u0430\u0441\u043a\u043e\u0440\u043e \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code><a href=\"https:\/\/docs.rs\/arrayvec\/0.7.4\/arrayvec\/struct.ArrayVec.html\">ArrayVec<\/a><\/code> \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"rust\">pub struct Batched&lt;const N: usize, I: Iterator> {   iter: I, }  impl&lt;const N: usize, I: Iterator> Iterator for Batched&lt;N, I> {   type Item = ArrayVec&lt;I::Item, N>;    #[inline]   fn next(&amp;mut self) -> Option&lt;Self::Item> {     let batch = ArrayVec::from_iter((&amp;mut self.iter).take(N));     (!batch.is_empty()).then_some(batch)   } }<\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439, \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0442 \u0443\u043f\u043b\u043e\u0449\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u043a\u0435\u0442:<\/p>\n<pre><code class=\"rust\">let all_qs = questions.indices(); all_qs.combinations(k)   .batched::&lt;1024>()   .par_bridge()   .map_init(     || (vec![0.; users.len()], vec![0.; users.len()], IndexSet::new(&amp;users)),     |(qs_totals, grand_totals, user_set), qs_batch| {       qs_batch         .into_iter()         .filter_map(|qs| {           \/\/ \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434.         })         .collect_vec()     })     .flatten()     \/\/ \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434<\/code><\/pre>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 5,000,000 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0437\u0430 982 \u043c\u0441. \u042d\u0442\u043e \u0432 6,9 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u0447\u0442\u043e \u0443\u0436\u0435 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u0434\u043b\u044f \u043c\u043e\u0435\u0439 10-\u044f\u0434\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u044b \u0431\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043b\u0438\u0441\u044c \u043a 10-\u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044e, \u043d\u043e \u044f \u0434\u0443\u043c\u0430\u044e, \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0431\u0435\u0437 \u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0421\u0432\u043e\u0434\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 2.<\/p>\n<p>  \u0422\u0430\u0431\u043b\u0438\u0446\u0430 2: \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tbody>\n<tr>\n<td>\u0423\u0440\u043e\u0432\u0435\u043d\u044c<\/td>\n<td>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <\/td>\n<td>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438<\/td>\n<td>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e Python<\/td>\n<td>\u041e\u0446\u0435\u043d\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f<\/td>\n<\/tr>\n<tr>\n<td>0_serial <\/td>\n<td>6.80 \u0441<\/td>\n<td>26,342.63\u00d7<\/td>\n<td><\/td>\n<td>57.51 \u043c\u0438\u043d<\/td>\n<\/tr>\n<tr>\n<td>1_parallel <\/td>\n<td>4.22 \u0441<\/td>\n<td>1.61\u00d7<\/td>\n<td>42,439.31\u00d7<\/td>\n<td>35.70 \u043c\u0438\u043d<\/td>\n<\/tr>\n<tr>\n<td>2_batched <\/td>\n<td>982.46 \u043c\u0441<\/td>\n<td>4.30\u00d7<\/td>\n<td>182,450.94\u00d7<\/td>\n<td>8.30 \u043c\u0438\u043d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  \u0427\u0435\u0433\u043e \u0436\u0435 \u043c\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438? \u041f\u0440\u0438 <code>k=5<\/code> \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Python \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u044b 2,9 \u0433\u043e\u0434\u0430 \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. \u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Rust \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u043e\u0433\u043e \u0436\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e 8 \u043c\u0438\u043d\u0443\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0447\u0442\u0438 \u0432 180,000 \u0440\u0430\u0437. \u041a\u0430\u043a\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438:<\/p>\n<ul>\n<li>\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 Rust;<\/li>\n<li>\u0445\u044d\u0448-\u0447\u0438\u0441\u043b\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a;<\/li>\n<li>(\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435) \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446;<\/li>\n<li>\u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u0438;<\/li>\n<li>SIMD \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442.<\/li>\n<li>\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u044f\u0434\u0440\u0430\u043c;<\/li>\n<li>\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0443\u0437\u043a\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043f\u0440\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b;<\/li>\n<\/ul>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e? \u0421\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/59\/bz\/fm\/59bzfm6etvjgzbi2bchs1o6wteq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/59\/bz\/fm\/59bzfm6etvjgzbi2bchs1o6wteq.png\"\/><\/p>\n<p>  \u041a\u043e\u0434 38% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0432 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0438 36% \u0437\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u044d\u0442\u0438\u0445 \u043a\u0430\u0440\u0442. \u0415\u0449\u0451 12% \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u0415\u0449\u0451 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0445\u0432\u043e\u0441\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  \u042f \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b \u0432\u0441\u0435 \u0443\u0441\u0438\u043b\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SIMD, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c +10% \u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 (\u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043b\u0438\u043d\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435), \u043d\u043e \u044f \u043d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f \u0435\u0449\u0451 \u043d\u0430 \u0446\u0435\u043b\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438, \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u0438\u0445 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c: <a href=\"https:\/\/github.com\/willcrichton\/corrset-benchmark\">github.com\/willcrichton\/corrset-benchmark<\/a><\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0431\u0435\u0437 \u0431\u0440\u0443\u0442\u0444\u043e\u0440\u0441\u0430, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435. \u0410 \u0442\u0430\u043a \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u043d\u0430\u0448\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 Rust.<\/p>\n<blockquote><p><b><font color=\"#3AC1EF\"><a href=\"https:\/\/t.me\/ruvds_community\">\u0423\u0437\u043d\u0430\u0432\u0430\u0439\u0442\u0435 \u043e \u043d\u043e\u0432\u044b\u0445 \u0430\u043a\u0446\u0438\u044f\u0445 \u0438 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u0430\u0445 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e Telegram-\u043a\u0430\u043d\u0430\u043b\u0430 ?<\/a><\/font><\/b><\/p><\/blockquote>\n<p><a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=Bright_Translate&amp;utm_content=kak_v_180,000_raz_uskorit_analiz_dannyx_s_pomoshhyu_rust\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/os\/g2\/ms\/osg2msglmcba81cfkh0vl0nlnu4.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/os\/g2\/ms\/osg2msglmcba81cfkh0vl0nlnu4.jpeg\" data-blurred=\"true\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/769808\/\"> https:\/\/habr.com\/ru\/articles\/769808\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/769808\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/dm\/mb\/vj\/dmmbvjo4prkdwo8rmilimlu8or0.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/dm\/mb\/vj\/dmmbvjo4prkdwo8rmilimlu8or0.jpeg\" data-blurred=\"true\"\/><\/div>\n<p><\/a><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u0432\u043e\u0438\u0445 \u0434\u0435\u0440\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432 \u0441\u0444\u0435\u0440\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Rust. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0432\u044b \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0451\u043c\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 Rust. <\/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-358450","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/358450","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=358450"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/358450\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=358450"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=358450"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=358450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}