Форум сайта python.su
0
Здравствуйте.
Я новичок в программировании на 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(shape
h,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(, dtype
TYPE)
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)
Офлайн
0
Разобрался в данном вопросе самостоятельно.
Использование профайлера показало, что время выполнения функции, в котором осуществлялся перебор массива, сильно зависит от вызовов функций np.cos и np.sin и практически не зависит от того используется ли Cython или чистый Python. Выход был найден в использовании векторизации NumPy. Это позволило сократить время заполнения массива с 12с до 0.4с для кода без использования Cython и до 0.07c при оптимизации с Cython.
Офлайн
16
В дальнейшем предлагаю Вам выделять код следующим образом
import sys
Офлайн
0
Ok. Спасибо за совет
Офлайн