Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2015 16:06:27

mvl
Зарегистрирован: 2015-01-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение массива с помощью Cython

Здравствуйте.

Я новичок в программировании на 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)

Офлайн

#2 Янв. 16, 2015 23:08:18

mvl
Зарегистрирован: 2015-01-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение массива с помощью Cython

Разобрался в данном вопросе самостоятельно.
Использование профайлера показало, что время выполнения функции, в котором осуществлялся перебор массива, сильно зависит от вызовов функций np.cos и np.sin и практически не зависит от того используется ли Cython или чистый Python. Выход был найден в использовании векторизации NumPy. Это позволило сократить время заполнения массива с 12с до 0.4с для кода без использования Cython и до 0.07c при оптимизации с Cython.

Офлайн

#3 Янв. 20, 2015 09:27:39

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Ускорение массива с помощью Cython

В дальнейшем предлагаю Вам выделять код следующим образом

import sys
Пункт выделения кода при написании сообщения найти нетрудно.
А так Вы предлагаете для начала заняться синтаксическим анализом всего написанного. Мало кому здесь это интересно.



————————–
Истина где-то рядом

Офлайн

#4 Янв. 30, 2015 13:08:37

mvl
Зарегистрирован: 2015-01-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение массива с помощью Cython

Ok. Спасибо за совет

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version