Numba: ячейки не поддерживаются

Я бы хотел использовать numba для ускорения этой функции:

from numba import jit @jit def rownowaga_numba(u, v): wymiar_x = len(u) wymiar_y = len(u[1]) f = [[[0 for j in range(wymiar_y)] for i in range(wymiar_x)] for k in range(9)] cx = [0., 1., 0., -1., 0., 1., -1., -1., 1.] cy = [0., 0., 1., 0., -1., 1., 1., -1., -1.] w = [4./9, 1./9, 1./9, 1./9, 1./9, 1./36, 1./36, 1./36, 1./36] for i in range( wymiar_x): for j in range (wymiar_y): for k in range(9): up = u[i][j] vp = v[i][j] udot = (up**2 + vp**2) cu = up*cx[k] + vp*cy[k] f[k][i][j] = w[k] + w[k]*(3.0*cu + 4.5*cu**2 - 1.5*udot) return f 

Где я тестирую его с такими данными:

 import timeit import math as m u = [[m.sin(i) + m.cos(j) for j in range(40)] for i in range(1000)] y = [[m.sin(i) + m.cos(j) for j in range(40)] for i in range(1000)] t0 = timeit.default_timer() for i in range (10): f = rownowaga_pypy(u,y) dt = timeit.default_timer() - t0 print('loop time:', dt) 

И я получаю эту ошибку:

  Traceback (most recent call last): File "C:\Users\Ricevind\Desktop\PyPy\Skrypty\Rownowaga.py", line 29, in <module> f = rownowaga_pypy(u,y) File "C:\pyzo2014a\lib\site-packages\numba\dispatcher.py", line 171, in _compile_for_args return self.compile(sig) File "C:\pyzo2014a\lib\site-packages\numba\dispatcher.py", line 348, in compile flags=flags, locals=self.locals) File "C:\pyzo2014a\lib\site-packages\numba\compiler.py", line 637, in compile_extra return pipeline.compile_extra(func) File "C:\pyzo2014a\lib\site-packages\numba\compiler.py", line 356, in compile_extra raise e File "C:\pyzo2014a\lib\site-packages\numba\compiler.py", line 351, in compile_extra bc = self.extract_bytecode(func) File "C:\pyzo2014a\lib\site-packages\numba\compiler.py", line 343, in extract_bytecode bc = bytecode.ByteCode(func=self.func) File "C:\pyzo2014a\lib\site-packages\numba\bytecode.py", line 343, in __init__ raise NotImplementedError("cell vars are not supported") NotImplementedError: cell vars are not supported 

Меня больше всего интересует значение «cell vars не поддерживается», поскольку Google не возвращает никаких результатов.

One Solution collect form web for “Numba: ячейки не поддерживаются”

Numba не работает особенно хорошо в настоящее время на вложенном списке списков (по крайней мере, начиная с v0.21). Я считаю, что это то, о чем говорит ошибка «ячеистых варов», но я не уверен на 100%. Ниже я конвертирую все в массивы numpy, чтобы оптимизировать код с помощью numba:

 import numpy as np import numba as nb import math def rownowaga(u, v): wymiar_x = len(u) wymiar_y = len(u[1]) f = [[[0 for j in range(wymiar_y)] for i in range(wymiar_x)] for k in range(9)] cx = [0., 1., 0., -1., 0., 1., -1., -1., 1.] cy = [0., 0., 1., 0., -1., 1., 1., -1., -1.] w = [4./9, 1./9, 1./9, 1./9, 1./9, 1./36, 1./36, 1./36, 1./36] for i in range( wymiar_x): for j in range (wymiar_y): for k in range(9): up = u[i][j] vp = v[i][j] udot = (up**2 + vp**2) cu = up*cx[k] + vp*cy[k] f[k][i][j] = w[k] + w[k]*(3.0*cu + 4.5*cu**2 - 1.5*udot) return f # Pull these out so that numba treats them as constant arrays cx = np.array([0., 1., 0., -1., 0., 1., -1., -1., 1.]) cy = np.array([0., 0., 1., 0., -1., 1., 1., -1., -1.]) w = np.array([4./9, 1./9, 1./9, 1./9, 1./9, 1./36, 1./36, 1./36, 1./36]) @nb.jit(nopython=True) def rownowaga_numba(u, v): wymiar_x = u.shape[0] wymiar_y = u[1].shape[0] f = np.zeros((9, wymiar_x, wymiar_y)) for i in xrange( wymiar_x): for j in xrange (wymiar_y): for k in xrange(9): up = u[i,j] vp = v[i,j] udot = (up*up + vp*vp) cu = up*cx[k] + vp*cy[k] f[k,i,j] = w[k] + w[k]*(3.0*cu + 4.5*cu**2 - 1.5*udot) return f 

Теперь давайте настроим несколько тестовых массивов:

 u = [[math.sin(i) + math.cos(j) for j in range(40)] for i in range(1000)] y = [[math.sin(i) + math.cos(j) for j in range(40)] for i in range(1000)] u_np = np.array(u) y_np = np.array(y) 

Сначала давайте проверим, что мой код numba дает тот же ответ, что и код OP:

 f1 = rownowaga(u, y) f2 = rownowaga_numba(u_np, y_np) 

Из ноутбука ipython:

 In [13]: np.allclose(f2, np.array(f1)) Out[13]: True 

И теперь давайте время на моем ноутбуке:

 In [15] %timeit f1 = rownowaga(u, y) 1 loops, best of 3: 288 ms per loop In [16] %timeit f2 = rownowaga_numba(u_np, y_np) 1000 loops, best of 3: 973 µs per loop 

Таким образом, мы получаем хороший 300-кратный ускорение с минимальными изменениями кода. Просто хочу отметить, что я использую ночную сборку Numba чуть раньше 0,22:

 In [16]: nb.__version__ Out[16]: '0.21.0+137.gac9929d' 
  • Когда функция numba компилируется?
  • Ошибка при установке Numba на OS X
  • Нельзя напечатать два значения (python3.5 + numba + CUDA8.0)
  • Используйте numba для ускорения цикла
  • Матричная инверсия без Numpy
  • Numba медленный при назначении массиву?
  • Почему numba быстрее, чем numpy здесь?
  • Numba 3x медленнее, чем numpy
  •  
    Interesting Posts for Van-Lav

    Как разобрать и написать XML с использованием ElementTree Python без перемещения пространств имен?

    Удаление кэша pip?

    Специальные требования Travis для каждой версии python

    Как использовать несколько цветовых паттернов в морском саду на одном и том же участке

    Аудиозапись в Python

    Закрыть последнюю открытую вкладку

    Если список проверок операторов содержит, возвращается true, если он не должен

    Анализ большого XML-файла с помощью Python lxml и Iterparse

    Как отправлять запросы с помощью JSON в модульных тестах

    отдельная вещественная и мнимая часть комплексного числа в python

    Запуск подпроцесса и вывода на печать для ведения журнала

    Замените все элементы массива Python NumPy, которые больше некоторого значения

    Как записать запрос и ответ с помощью прокси-сервера в Mountebank?

    Имя текущего приложения в Google App Engine (Python)

    Как получить (sub) имя класса из статического метода в Python?

    Python - лучший язык программирования в мире.