Cython Groupby функционирует намного медленнее, чем аналогичная функция NumbaPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Cython Groupby функционирует намного медленнее, чем аналогичная функция Numba

Сообщение Anonymous »

У меня очень простая группа по функции, которую я хочу использовать в цинтоне, но это примерно в 400 раз медленнее, чем аналогичная функция в Python jited by numba < /p>
Это моя Функция цинтона < /p>

Код: Выделить всё

@cython.boundscheck(False)  # Deactivate bounds checking
@cython.wraparound(False)  # Deactivate negative indexing.
@cython.ccall
def groupby(
in_index: cython.long[:], in_values: cython.float[:], number_of_results: cython.long
) -> cython.double[:]:
results = np.zeros(number_of_results, dtype=np.float64)
results_view: cython.float[:] = results
index: cython.long[:] = in_index
val: cython.float[:] = in_values
index_max: cython.Py_ssize_t = in_index.shape[0]
n: cython.Py_ssize_t
for n in range(index_max):
results_view[index[n]] += val[n]

return results
< /code>
Но эта функция с numba < /p>
@jit(nopython=True, fastmath=True)
def agg_sims(group_idx, a, number_of_sims):
output = np.zeros(number_of_sims, dtype=np.float64)
for i in range(group_idx.shape[0]):
output[group_idx[i]] += a[i]
return output
< /code>
Я хотел бы использовать цифон, потому что Numba плохо справляется с объектом, который я создал Выход функции в собственный файл и составил его с цинтоном (в Windows с инструментами VS Build) и использованием набора случайных данных, но индекс упорядочен < /p>
Это пример Данные < /p>
sim_index=np.array([0,1,2,2,3,3,3,3,3,4,4,5,5,5,5,6,6,7,7,7,7,7,8,8,9,9,9])

loss_values=np.array([983218.798545568,78773.246069412,427915.701586101,384401.565066934,976474.931385909,
491002.57968459,449277.841899304,2157814.69086177,634849.51236713,683151.164470444,951717.254327894,
338593.160096285,111153.600572457,327118.874300972,585857.183862426,1793115.50344123,775898.742468206,
236320.911958699,412790.930873261,894075.886633843,400713.081209467,1142732.59966746,
651378.893317142,238021.483213581,50557.1083702021,75622.454060533,153180.479257057])
< /code>
Фактические данные составляют около 2,5 млн. Значения

Groupby в цинтоне, которые привели мне это с Timeit

805 мс ± 30,9 мс за за каждую Цикл (среднее ± Std. Dev. из 7 прогонов, 1 цикл каждый) < /p>
Но версия Numba с одинаковыми данными < /p>
4,35 мс ± 667 μs на цикл (среднее значение ± Std. Dev. из 7 прогонов, 1 цикл каждый) < /p>
Я в потере того, почему функция цинтона намного медленнее, чем функция Numba. /p>
Функция цинтона не показывает каких -либо основных взаимодействий Python в файле HTML аннотации. Действительно просто функция Numpy. < /P>
Любые предложения действительно были бы полезны. случай.  Но в этом примере цифон примерно та же скорость, что и версия Numba.  Мне пришлось изменить длины на длинные.  Я сделал то же самое в исходную функцию и перекомпилировался, и у нее все еще есть выпуск производительности, поэтому я предполагаю, что есть настройка компилятора, которую я не хватает в setup.py, и что ноутбук использует.  < /P>
'' < /p>
#cell
%load_ext cython
import numpy as np
import cython
from numba import jit

#cell
%%cython
import numpy as np
import cython
@cython.boundscheck(False)  # Deactivate bounds checking
@cython.wraparound(False)  # Deactivate negative indexing.
def groupby_cy(
in_index: cython.longlong[::1],
in_values: cython.double[::1],
number_of_results: cython.longlong,
) -> cython.double[:]:
results: cython.double[::1] = np.zeros(number_of_results, dtype=np.float64)
results_view: cython.double[::1] = results
index_max: cython.Py_ssize_t = in_index.shape[0]
n: cython.Py_ssize_t
for n in range(index_max):
results_view[in_index[n]] += in_values[n]

return results

#cell
@jit("float64[:](int64[:], float64[:], int64)", nopython=True, fastmath=True)
def groupby_nb(group_idx, a, number_of_sims):
output = np.zeros(number_of_sims, dtype=np.float64)
for i in range(group_idx.shape[0]):
output[group_idx[i]] += a[i]
return output

#cell
#sample data
number_of_sims = 1_000_000
rng_generator = np.random.default_rng(100)
number_of_events = np.random.poisson(6, number_of_sims)
sim_index = np.arange(number_of_sims).repeat(number_of_events)
sim_values = rng_generator.normal(10000, 10, len(sim_index))

#cell
#timings
%%timeit
test_nb = groupby_nb(sim_index, sim_values, number_of_sims)

#cell
%%timeit
test_cy = groupby_cy(sim_index, sim_values, number_of_sims)
< /code>
'' '
Это текущая setup.py < /p>
' '' < /p>
from typing import Annotated
from setuptools import setup, Extension
from Cython.Build import cythonize
import numpy

extensions = [

Extension(
"groupby_cy",
[r".\libs\groupby_cy.py"],
extra_compile_args=["/O2"],
),
]

setup(
ext_modules=cythonize(
module_list=extensions,
compiler_directives={
"language_level": "3",
},
annotate=True,
),
include_dirs=[numpy.get_include()],
)
'' '


Подробнее здесь: https://stackoverflow.com/questions/794 ... a-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Cython Groupby функционирует намного медленнее, чем аналогичная функция Numba
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Cython Groupby функционирует намного медленнее, чем аналогичная функция Numba
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Почему моя функция сортировки C ++ намного медленнее, чем моя функция сортировки C#?
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Почему моя функция сортировки C ++ намного медленнее, чем моя функция сортировки C#?
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Webassembly работает намного медленнее, чем чистая функция JavaScript.
    Anonymous » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»