Я провел несколько тестов производительности, используя различные методы:
Вот результаты, которые я получил для 1000000 перемешиваний:
188A1AA0P001 usefString 0.518183742
188A1AA0P001 useMap 1.415851829
188A1AA0P001 useConcat 0.5654986979999999
188A1AA0P001 useFormat 0.800639699
188A1AA0P001 useJoin 0.5488918539999998
на основе этого, кажется, что строка формата с жестко закодированными подстроками быть самым быстрым.
Вот код, который я использовал для тестирования:
def usefString(s): return f"{s[5:8]}{s[0]}{s[4]}{s[1:4]}{s[8:]}"
posMap = [5,6,7,0,4,1,2,3,8,9,10,11]
def useMap(s): return "".join(map(lambda i:s[i], posMap))
def useConcat(s): return s[5:8]+s[0]+s[4]+s[1:4]+s[8:]
def useFormat(s): return '{}{}{}{}{}'.format(s[5:8],s[0],s[4],s[1:4],s[8:])
def useJoin(s): return "".join([s[5:8],s[0],s[4],s[1:4],s[8:]])
from timeit import timeit
count = 1000000
s = "AAA01188P001"
t = timeit(lambda:usefString(s),number=count)
print(usefString(s),"usefString",t)
t = timeit(lambda:useMap(s),number=count)
print(useMap(s),"useMap",t)
t = timeit(lambda:useConcat(s),number=count)
print(useConcat(s),"useConcat",t)
t = timeit(lambda:useFormat(s),number=count)
print(useFormat(s),"useFormat",t)
t = timeit(lambda:useJoin(s),number=count)
print(useJoin(s),"useJoin",t)
Производительность : (добавлено @jezrael)
N = 1000000
OrderProduct = pd.DataFrame({'OrderProductId':['AAA01188P001'] * N})
In [331]: %timeit [f'{s[5:8]}{s[0]}{s[4]}{s[1:4]}{s[8:]}' for s in OrderProduct['OrderProductId']]
527 ms ± 16.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [332]: %timeit [s[5:8]+s[0]+s[4]+s[1:4]+s[8:] for s in OrderProduct['OrderProductId']]
610 ms ± 18.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [333]: %timeit ['{}{}{}{}{}'.format(s[5:8],s[0],s[4],s[1:4],s[8:]) for s in OrderProduct['OrderProductId']]
954 ms ± 76.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [334]: %timeit ["".join([s[5:8],s[0],s[4],s[1:4],s[8:]]) for s in OrderProduct['OrderProductId']]
594 ms ± 10.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Я не использую Kohana, но что я делаю в своей платформе, то, что сценарии Ajax являются контроллерами. Я пытаюсь рассматривать их как автономные контроллеры, но в конце они - просто контроллеры.
Я склонен помещать свои ajax действия в тот же контроллер как non-ajax действия для любой данной модели.
Когда я могу, я попытаться использовать те же действия и только изменить выходной тип. Большинство задач должно иметь non-ajax версию так или иначе, таким образом, это имеет тенденцию работать вполне хорошо. Очень удобный для сокращения логического дублирования.
Ajax пересекает все границы MVC. Таким образом, это не входит только в одну из модели, представления или контроллера.
Что касается отправки сценариев (файлы JavaScript) сами, это, вероятно, будет обработанным непосредственно веб-сервером, а не из Вашей платформы MVC.
Вы делаете различные контроллеры для, ДОБИРАЮТСЯ и запросы POST? Я не делаю. По-моему, с запросами JS нельзя иметь дело по-другому также.
Я лично вижу запросы JS точно так же, как ДОБИРАЮТСЯ, POST или любой другой тип запроса. Таким образом, если у меня есть связанные с пользователем основанные на JS действия, я просто создаю их в пользовательском контроллере.
Если Вы имеете в виду Ajax (JavaScript) сами сценарии, они должны войти в Вашу public/js папку. Однако, если Вы имеете в виду действия, вызванные этими запросами Ajax, их нужно рассматривать как любые другие действия соответствующих контроллеров. Чтобы быть АБСОЛЮТНО УСПОКОИТЕЛЬНЫМИ, необходимо использовать другой формат (json, xml, и т.д.) как возвращаемые значения для тех действий.
Используя отдельный контроллер хорошая идея. Я любой организует мои контроллеры функцией и затем действиями типом возврата.
Кроме того, то, когда я использую Опоры, я могу украсить действие @jsonify, и это будет автоматически заботиться о преобразовании Python, возражает против JSON.Очень удобно.
Мне нравится хранить все мои запросы ajax в одном контроллере, обычно отправляя их через общий ресурс модель (которую также использует не ajax-контроллер)
Основным отличием является представление, которое получается через ajax-контроллер (фрагменты html, данные json и т. д.) или не-ajax-контроллер (полные страницы)
Вы можете завернуть его как обычный REST-api, и использовать RESTful конвенции и URI. Пример:
Вместо index.php/ajax/editprofile это может быть PUT-запрос на index.php/api/profile/profilename
.