Cython самый быстрый способ обработки массивов ⇐ Python
-
Гость
Cython самый быстрый способ обработки массивов
В моем проекте я хотел бы быстро разобраться с целочисленными массивами. В частности, я хочу создавать их и проходить через них как можно быстрее.
Я вижу, что numpy рекомендуется повсюду, поскольку массивы numpy работают как типизированные представления памяти Cython. Это упоминается в документации cython https://cython.readthedocs.io/en/latest ... views.html
%%cython импортировать numpy как np cpdef test_1(int[:] lst): cdef int[100] ret для ii в диапазоне (lst.shape[0]): ret[ii] = lst[ii] вернуть возврат cpdef test_2(int[:] lst): cdef int[:] ret = np.empty(100, dtype=np.dtype("i")) для ii в диапазоне (lst.shape[0]): ret[ii] = lst[ii] вернуть возврат cpdef test_3 (список списка): список cdef ret = [0]*100 для ii в диапазоне(len(lst)): ret[ii] = lst[ii] вернуть возврат Я ожидаю, что типизированный массив будет работать намного быстрее (test_1). Я также ожидаю, что, поскольку numpy рекламируется повсюду (test_2), он будет достаточно быстрым. И возвращение к списку объектов Python с созданием [0]*100 происходит настолько медленно, насколько это возможно. К моему удивлению, выбрав время для трех тестов, я получил следующее:
импортировать numpy как np lst_1 = [1, 2, 3, 4, 5] lst_2 = np.array(dsa, dtype=np.intc) %timeit test_1(lst_2) %timeit test_2(lst_2) %timeit test_3(lst_1) 1,3 мкс ± 60,3 нс на цикл (среднее ± стандартное отклонение для 7 циклов по 1 000 000 циклов каждый) 1,43 мкс ± 18,3 нс на цикл (среднее ± стандартное отклонение для 7 циклов по 1 000 000 циклов каждый) 481 нс ± 13,1 нс на цикл (среднее ± стандартное отклонение для 7 циклов по 1 000 000 циклов каждый) Почему список Python самый быстрый? Что-то я делаю неправильно, когда создаю или получаю доступ к представлениям памяти? Как я могу очень быстро создавать массивы int и получать к ним доступ в cython?
В моем проекте я хотел бы быстро разобраться с целочисленными массивами. В частности, я хочу создавать их и проходить через них как можно быстрее.
Я вижу, что numpy рекомендуется повсюду, поскольку массивы numpy работают как типизированные представления памяти Cython. Это упоминается в документации cython https://cython.readthedocs.io/en/latest ... views.html
%%cython импортировать numpy как np cpdef test_1(int[:] lst): cdef int[100] ret для ii в диапазоне (lst.shape[0]): ret[ii] = lst[ii] вернуть возврат cpdef test_2(int[:] lst): cdef int[:] ret = np.empty(100, dtype=np.dtype("i")) для ii в диапазоне (lst.shape[0]): ret[ii] = lst[ii] вернуть возврат cpdef test_3 (список списка): список cdef ret = [0]*100 для ii в диапазоне(len(lst)): ret[ii] = lst[ii] вернуть возврат Я ожидаю, что типизированный массив будет работать намного быстрее (test_1). Я также ожидаю, что, поскольку numpy рекламируется повсюду (test_2), он будет достаточно быстрым. И возвращение к списку объектов Python с созданием [0]*100 происходит настолько медленно, насколько это возможно. К моему удивлению, выбрав время для трех тестов, я получил следующее:
импортировать numpy как np lst_1 = [1, 2, 3, 4, 5] lst_2 = np.array(dsa, dtype=np.intc) %timeit test_1(lst_2) %timeit test_2(lst_2) %timeit test_3(lst_1) 1,3 мкс ± 60,3 нс на цикл (среднее ± стандартное отклонение для 7 циклов по 1 000 000 циклов каждый) 1,43 мкс ± 18,3 нс на цикл (среднее ± стандартное отклонение для 7 циклов по 1 000 000 циклов каждый) 481 нс ± 13,1 нс на цикл (среднее ± стандартное отклонение для 7 циклов по 1 000 000 циклов каждый) Почему список Python самый быстрый? Что-то я делаю неправильно, когда создаю или получаю доступ к представлениям памяти? Как я могу очень быстро создавать массивы int и получать к ним доступ в cython?
Мобильная версия