У меня очень простая группа по функции, которую я хочу использовать в цинтоне, но это примерно в 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()],
)
У меня очень простая группа по функции, которую я хочу использовать в цинтоне, но это примерно в 400 раз медленнее, чем аналогичная функция в Python jited by numba < /p> Это моя Функция цинтона < /p> [code]@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
У меня очень простая группа по функции, которую я хочу использовать в цифонном объекте, но это примерно в 400 раз медленнее, чем аналогичная функция в Python jited от Numba
Это моя функция цинтона
@cython.boundscheck(False) # Deactivate bounds...
У меня очень простая группа по функции, которую я хочу использовать в цинтоне, но это примерно в 400 раз медленнее, чем аналогичная функция в Python jited by numba
Это моя Функция цинтона
@cython.boundscheck(False) # Deactivate bounds checking...
Я очень новичок в c ++ , но у меня есть опыт работы с другими объектно -ориентированными языками программирования. Первоначально я написал программу в c ++ для практики, но мне было любопытно посмотреть, как она будет работать против моего основного...
Я очень новичок в c ++ , но у меня есть опыт работы с другими объектно -ориентированными языками программирования. Первоначально я написал программу в c ++ для практики, но мне было любопытно посмотреть, как она будет работать против моего основного...
Я новичок в веб-сборке. я просто пробую, написав функцию для фильтрации массива объектов по некоторым критериям и возврата массива идентификаторов. я запускаю эту функцию и измеряю время выполнения. Удивительно, но Webassembly работает в 10 раз...