Перейти к содержимому

Лидеры


Популярный контент

Показан контент с высокой репутацией 06.03.2021 в Сообщения

  1. 1 балл
    Вроде разгрёб завал на учёбе, потихоньку возвращаюсь к OC. Вот очередная реализация, правда уже не очень простая. За то по скорости не уступает варианту с предварительно заданным списком файлов. Сам инсталятор: local internet = require("internet") local fs = require("filesystem") local shell = require("shell") local ser = require("serialization") local host = "alexcatze.pythonanywhere.com" local owner = "AlexCatze" local repo = "RacoonNet" local ref = "v0.2" local path = "/" local deploy_to = "/" function request(url) local data = "" local result, response = pcall(internet.request, url) if result then local result = pcall(function() for chunk in response do data = data .. chunk end end) end return data end files = ser.unserialize(request("http://"..host.."/?owner="..owner.."&repo="..repo.."&path="..path.."&ref="..ref)) for _,v in pairs(files) do local pth = deploy_to..v if not fs.exists(pth:match(".*/")) then fs.makeDirectory(pth:match(".*/")) end shell.execute("wget -f ".."https://raw.githubusercontent.com/"..owner.."/"..repo.."/"..ref.."/"..v.." "..pth) end Как видно, он стучится мне на pythonanywhere, откуда и берёт список файлов. Вот код с pythonanywhere: from flask import Flask from flask import request import requests import json def request_url(url, result): r = requests.get(url) j = json.loads(r.text) for x in j: if x["type"] == "file": result = result + "\"" + x["path"] + "\"," else: result = request_url(x["url"],result) return result app = Flask(__name__) def main(): uname = "AlexCatze" token = "тут мой токен, вам я его не скажу!!!" if uname != request.args["owner"]:#Проверка, что бы другие не использовали мой лимит return "{}" result = request_url("https://"+uname+":"+token+"@api.github.com/repos/"+request.args["owner"]+"/"+request.args["repo"]+"/contents"+request.args["path"]+"?ref="+request.args["ref"],"{") result = result + "}" return result app.add_url_rule("/", "main", main,methods=['GET']) Тут мы получаем запрос, из него извлекаем нужные данные. Потом используя api ключ(тогда лимит запросов 5000 в час), рекурсивно получаем список файлов, и отправляем его на клиент. Вечером подробно распишу, как это настроить.
  2. 1 балл
    Я говорил именно про объявление локальной переменной внутри цикла, это чисто косметический эффект. Если мы хотим избавиться от индексирования таблицы, переменная создаётся в любом случае – явным образом или нет. Да, я понял. Мне показался слишком категоричным призыв отказаться от использования итератора ipairs. Но сейчас твоя позиция мне полностью понятна.
  3. 1 балл
    Хе-хе, я ждал этого вопроса. Как говорится, пути компиляторов неисповедимы: к примеру, если каким-либо образом обрабатывать элементы таблицы, создавая иллюзию реальной деятельности в теле цикла, то ipairs, разумеется, проигрывает, т.к. это функция-итератор, которая чисто технически не может быть быстрее простого цикла с числовым лимитом: Bench() :Add("for i = 1, #tbl do", function() for i = 1, #tbl do local var = math.floor(#tbl[i]) end end) :Add("for i, v in ipairs(tbl) do", function() for i, v in ipairs(tbl) do local var = math.floor(#v) end end) :Start(100000000) Если же получить элемент таблицы и ничего с ним не делать, то компилятор оптимизирует тело второго цикла, банально удалив "лишнее" присвоение. При этом индексация в первом случае останется нетронутой, и создастся иллюзия ускорения: Bench() :Add("for i = 1, #tbl do", function() for i = 1, #tbl do local var = tbl[i] end end) :Add("for i, v in ipairs(tbl) do", function() for i, v in ipairs(tbl) do local var = v end end) :Start(100000000) А вот в этом случае ipairs опять в пролёте даже несмотря на дополнительную индексацию по таблице в теле первого цикла, т.к. накладные расходы на вызов функции-итератора превышают расходы на индексацию таблиц: Bench() :Add("for i = 1, #tbl do", function() for i = 1, #tbl do local var = #tbl[i] + math.floor(i) end end) :Add("for i, v in ipairs(tbl) do", function() for i, v in ipairs(tbl) do local var = #v + math.floor(i) end end) :Start(100000000)
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...