2013-04-02 5 views
1

У меня есть этот код, который работает слишком медленно.Динамическое распределение памяти с Cython

returnMask = [] 
for curPage in range(numPages): 
    print curPage 
    curPageAddr = curPage + startPage 
    cumMask = np.ones((numBytes)).astype(int) * 0xff 
    for maskFunction, maskAction in maskPattern: 
      #maskArgs['funcArgs']['startPage'] = curPageAddr 
      #maskArgs['funcArgs']['numPages'] = 1 
      inputArgs['funcArgs']['startPage'] = curPageAddr 
      inputArgs['funcArgs']['numPages'] = 1 
      curMaskName, curMaskData = maskFunction(inputArgs) 
      if (maskAction == 'include'): 
        maskIn = np.array(curMaskData).astype(int) 
      if (maskAction == 'exclude'): 
        maskIn = (~np.array(curMaskData).astype(int)) & 0xff 
      cumMask = cumMask & maskIn 
    print "cumMask size %d" % len(cumMask) 
    returnMask += cumMask.astype(int).tolist() 

В принципе, мой внешний цикл зациклился 2000 раз и каждый раз, присоединяя список 2048 байт в returnMask. Я думал, что могу использовать Cython, изменить returnMask в динамически выделенный массив c, и это может ускорить мой код. Может ли кто-нибудь сказать мне, если это хороший способ решить эту проблему?

+0

Пожалуйста, разместите весь код. Переключитесь на 'xrange' вместо' range'. Кроме того, ваш код, вероятно, тратит большое количество времени на запись в терминал из-за заявлений печати. –

+0

Чтобы отправить код, совершите поездку в [pastebin] (http://pastebin.com/) – xxmbabanexx

ответ

0

Трудно сказать - как медленно это (в секундах)?

Мое первое предположение, что ваш maskFunction принимает все время.

Во-вторых, np.array().astype() объединяет две функции, которые являются медленными и работают ~ - это третья функция. Тогда ваш внешний цикл имеет astype и tolist, которые являются медленными. Выполнение этих вещей в Китоне - это то, где вы действительно увидите улучшение.

Я действительно сомневаюсь, что range и print занимают значительное время.

Вы измерили узкие места? Обычно я помещаю в некоторые time.time() звонки вокруг различных функций и средние значения по всему циклу:

dt = np.zeros((len(loop),)) 
for i in loop: 
    t = time.time() 
    slow_function() 
    dt[i] = time.time() - t 
print "avg. time for slow_function was %.3f s" % dt.mean() 
Смежные вопросы