Найти - Пользователи
Полная версия: Ускорение массива с помощью Cython
Начало » Python для новичков » Ускорение массива с помощью Cython
1
mvl
Здравствуйте.

Я новичок в программировании на Python. Стоит задача генерирования двумерного массива (изображения) и вывода его на экран. Программу пишу с помощью Python(x,y).
Размер массива 1040х1390. Пользовался модулями NumPy, matplotlib. Создаю два файла: в одном определяю функцию, которая задает массив в другом вызываю первую функцию и вывожу массив на экран.

Функция
import numpy as np
def inter(T, h, w, shift, alfa=90, Amin=0, Amax=255, fi=0):
M=np.ndarray(shapeh,w))
for i in range(h):
for j in range(w):
M = (Amin + (Amax-Amin)/2*(1+np.cos(2*np.pi/T*(i*np.cos(alfa) + j*np.sin(alfa))+shift+fi)))
return M

Ее вызов
import plot
import model as mdl
M1=mdl.inter(200, 1040, 1390, 0)
plot.imgPlot(M1)

Проблема в том, что вычисление массива происходит долго около 13 сек.

Пробовал использовать для массива Cython. Но ускорения вычисления не происходит. Подскажите где я ошибаюсь.

Функция
import numpy as np
cimport numpy as np
cimport cython

ctypedef np.int_t DTYPE_t

@cython.boundscheck(False)
@cython.wraparound(False)
def inter():
DTYPE = np.int
cdef int T = 200
cdef int h = 1040
cdef int w = 1390
cdef int shift = 0
cdef int alfa=90
cdef int Amin=0
cdef int Amax=255
cdef int fi=0

cdef np.ndarray M = np.zeros(, dtypeTYPE)

for i in range(h):
for j in range(w):
M = (Amin + (Amax-Amin)/2*(1+np.cos(2*np.pi/T*(i*np.cos(alfa) + j*np.sin(alfa))+shift+fi)))
return M

Вызов
import plot
import pyximport, numpy
pyximport.install(setup_args={“script_args”:, “include_dirs”:numpy.get_include()}, reload_support=True)
import Cython.Compiler.Options
Cython.Compiler.Options.annotate = True

import model1 as mdl1
M1=mdl1.inter()
plot.imgPlot(M1)
mvl
Разобрался в данном вопросе самостоятельно.
Использование профайлера показало, что время выполнения функции, в котором осуществлялся перебор массива, сильно зависит от вызовов функций np.cos и np.sin и практически не зависит от того используется ли Cython или чистый Python. Выход был найден в использовании векторизации NumPy. Это позволило сократить время заполнения массива с 12с до 0.4с для кода без использования Cython и до 0.07c при оптимизации с Cython.
alexbadaloff
В дальнейшем предлагаю Вам выделять код следующим образом
import sys
Пункт выделения кода при написании сообщения найти нетрудно.
А так Вы предлагаете для начала заняться синтаксическим анализом всего написанного. Мало кому здесь это интересно.
mvl
Ok. Спасибо за совет
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB