Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 5

Оптимизация расчета децилей

12.10.2015, 13:53. Показов 1388. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Написал небольшой скрипт по расчету децилей по определенному массиву с определенным периодом.
Понимаю, что код далеко не оптимален, т.к. только изучаю пайтон.
Подскажите, как возможно его оптимизировать и ускорить его выполнение.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def DECILI (values, period):
    lend = len(values)
    decil = np.zeros(lend)
    decil1 = np.zeros(lend)
    decil1 = np.zeros(lend)
    decil2 = np.zeros(lend)
    decil3 = np.zeros(lend)
    decil4 = np.zeros(lend)
    decil5 = np.zeros(lend)
    decil6 = np.zeros(lend)
    decil7 = np.zeros(lend)
    decil8 = np.zeros(lend)
    decil9 = np.zeros(lend)
    for j in range (period-1, lend):
        x = values[j-period+1:j+1]
        decil1[j], decil2[j], decil3[j], decil4[j], decil5[j], decil6[j], decil7[j], decil8[j], decil9[j] = np.percentile(x, [10,20,30,40,50,60,70,80,90])
    for i in range (period-1,lend):
        if values[i]<=decil1[i]:
            decil[i] = 1
        elif values[i]>decil9[i]:
            decil[i] = 10
        elif decil1[i]<values[i]<=decil2[i]:
            decil[i] = 2
        elif decil2[i]<values[i]<=decil3[i]:
            decil[i] = 3
        elif decil3[i]<values[i]<=decil4[i]:
            decil[i] = 4
        elif decil4[i]<values[i]<=decil5[i]:
            decil[i] = 5
        elif decil5[i]<values[i]<=decil6[i]:
            decil[i] = 6
        elif decil6[i]<values[i]<=decil7[i]:
            decil[i] = 7
        elif decil7[i]<values[i]<=decil8[i]:
            decil[i] = 8
        elif decil8[i]<values[i]<=decil9[i]:
            decil[i] = 9
    return decil
Спасибо)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2015, 13:53
Ответы с готовыми решениями:

Оптимизация расчета рейтинга ЭЛО
Здравствуйте. Пытаюсь посчитать рейтинги ЭЛО для теннисистов. Есть такая исходная таблица (Пример ~27к строк). Я попытался реализовать это...

Оптимизация расчета
Народ мож кто подскажет короче есть цикл внутри, которого гоняется функция по определенному расчета функция вылизана чутли не побайтно по...

Оптимизация расчета с кучей функций
Добрый день. Подскажите как лучше оптимизировать расчеты. Суть проблемы. Делаю физические расчеты. Есть набор исходных данных...

5
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
12.10.2015, 15:52
Про двумерные массивы слышали?
Python
1
decil = np.zeros([10, lend])
1
Заблокирован
19.10.2015, 02:04
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def DECILI (values, period):
    lend = len(values)
    decil = np.zeros(lend)
    decil1 = np.zeros(lend)
    decil1 = np.zeros(lend)
    decil2 = np.zeros(lend)
    decil3 = np.zeros(lend)
    decil4 = np.zeros(lend)
    decil5 = np.zeros(lend)
    decil6 = np.zeros(lend)
    decil7 = np.zeros(lend)
    decil8 = np.zeros(lend)
    decil9 = np.zeros(lend)
    for j in range (period-1, lend):
        x = values[j-period+1:j+1]
        decil1[j], decil2[j], decil3[j], decil4[j], decil5[j], decil6[j], decil7[j], decil8[j], decil9[j] = np.percentile(x, [10,20,30,40,50,60,70,80,90])
        if values[i]<=decil1[i]:
            decil[i] = 1
        elif values[i]>decil9[i]:
            decil[i] = 10
        elif decil1[i]<values[i]<=decil2[i]:
            decil[i] = 2
        elif decil2[i]<values[i]<=decil3[i]:
            decil[i] = 3
        elif decil3[i]<values[i]<=decil4[i]:
            decil[i] = 4
        elif decil4[i]<values[i]<=decil5[i]:
            decil[i] = 5
        elif decil5[i]<values[i]<=decil6[i]:
            decil[i] = 6
        elif decil6[i]<values[i]<=decil7[i]:
            decil[i] = 7
        elif decil7[i]<values[i]<=decil8[i]:
            decil[i] = 8
        elif decil8[i]<values[i]<=decil9[i]:
            decil[i] = 9
    return decil
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 5
02.11.2015, 14:00  [ТС]
Сжал код до следующего вида:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def DECILI (values, window):
    lend = len(values)
    decil = np.zeros(lend)
    for i in range (window-1,lend):
        x = values[i-window+1:i+1]
        decil1, decil2, decil3, decil4, decil5, decil6, decil7, decil8, decil9 = np.percentile(x, [10,20,30,40,50,60,70,80,90])
        if values[i] <= decil1: decil[i] = 1
        elif values[i] > decil9: decil[i] = 10
        elif decil1 < values[i] <= decil2: decil[i] = 2
        elif decil2 < values[i] <= decil3: decil[i] = 3
        elif decil3 < values[i] <= decil4: decil[i] = 4
        elif decil4 < values[i] <= decil5: decil[i] = 5
        elif decil5 < values[i] <= decil6: decil[i] = 6
        elif decil6 < values[i] <= decil7: decil[i] = 7
        elif decil7 < values[i] <= decil8: decil[i] = 8
        elif decil8 < values[i] <= decil9: decil[i] = 9
    return decil
Но, к сожалению, быстродействие практически не увеличилось. Не подскажите что еще можно было бы оптимизировать?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.11.2015, 14:55
А чо ваще надо-то? Просто делением тут не обойтись?
Есть ещё функция np.digitize, делает похожее.
Но она для произвольной последовательности, у вас же, судя по строке np.percentile(x, [10,20,30,40,50,60,70,80,90]), интервалы равномерные. Что именно имелось в виду, не очень понятно, а разбираться неохота.
1
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 5
03.11.2015, 14:42  [ТС]
dondublon, большое спасибо за наводку на np.digitize!

Код получился следующим:
Python
1
2
3
4
5
6
7
def DECILI_NP(values, window):
    lend = len(values)
    decil = np.zeros(lend)
    for i in range (window-1,lend):
        x = values[i-window+1:i+1]
        decil[i] = np.digitize([values[i]], np.percentile(x, [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]), right = False)
    return decil
Ускорение с предыдущей версией около 25%, это очень круто. Спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2015, 14:42
Помогаю со студенческими работами здесь

Оптимизация расчета СКО для каждого элемента массива
День добрый форумчане. Поставлена задача для каждого элемента массива рассчитать СКО (с квадратом 13x13). С этим я вроде справился, теперь...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был создан миф. Это миф о цветовой индефикации...

Написать функции: расчета вписанной и расчета описанной окружности около фигуры.
Всем привет! Требуется Ваша помощь! Окружность вписанная и описанная Написать функции: расчета вписанной и расчета описанной...

Создание Сторно В Регистре Расчета С Таким Же Видом Расчета
Как в регистре расчета 1С8.2 создать сторно с таким же видом расчета.В 1С 7.7 это происходит автоматом при вводе записи.Через...

Создать программу, содержащую функцию расчета одного слагаемого и процедуру расчета всей суммы целиком
Помогите, пожалуйста, не знаю как решить вообще. Выпернут из института, если не сделаю Поэтому прошу умных людей помочь. Задание ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru