Numba:不支持单元格变量

2024-03-11

我想使用 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

我最感兴趣的是“不支持单元格变量”的含义,因为谷歌没有返回任何有意义的结果。


Numba 目前在列表的嵌套列表上工作得不是特别好(至少从 v0.21 开始)。我相信这就是“cell vars”错误所指的,但我不是 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 倍的加速。请注意,我使用的是 0.22 之前版本的 Numba 夜间版本:

In [16]: nb.__version__
Out[16]:
'0.21.0+137.gac9929d'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numba:不支持单元格变量 的相关文章

随机推荐

  • 为什么无法使用 DataContractSerializer 序列化对象?

    我正在尝试使用 DataContractSerializer 序列化类型 但出现以下异常 这不适用于 SOA 服务 但如果可能的话 我仍然想使用 DataContractSerializer 我正在使用 Net 3 5 SP1 类型 Sys
  • Python 3.5 中的类型提示是什么?

    Python 3 5 中最受关注的功能之一是类型提示 一个例子类型提示中提到本文 http lwn net Articles 650904 and this one http lwn net Articles 640359 同时还提到负责任
  • jquery从字符串到时间的转换

    我正在开发一个系统 它以以下格式记录一天中的各个时间 06 53 22 or 19 23 58作为例子 谁能告诉我是否可以将此字符串转换为 javascript 构造 我可以用它来比较一天中的时间 您可以这样解析时间 function ti
  • 使用 -fPIC 编译的程序在跨过 GDB 中的线程局部变量时崩溃

    这是一个非常奇怪的问题 只有当程序编译时才会出现 fPIC option Using gdb我能够打印线程局部变量 但单步执行它们会导致崩溃 thread c include
  • WiX 中的新对话框,单击“后退”会跳过该对话框

    我是 WiX 的新手 正在尝试通过添加新的对话框来自定义对话框队列 新对话框的名称为 ServerChoice 流程为 SetupTypeDlg 完整或典型 ServerChoice verifyReadyDlg or SetupTypeD
  • Tomcat ExpiresFilter 无法正常工作

    我无法让 Tomcat 发送具有正确过期定义的图像 浏览器不断发送对已下载图像的 get 请求 Tomcat 响应 304 我想要的是 Tomcat 将使用正确的 expires 标头响应初始请求 并且没有任何 Last modified
  • 这是 n 层架构的正确实现吗?

    我在过去一年左右的时间里一直在学习 C 并尝试在此过程中融入最佳实践 在 StackOverflow 和其他网络资源之间 我认为我处于正确分离我的关注点的正确轨道上 但现在我有一些疑问 并希望在将整个网站转换为这个新网站之前确保我走的是正确
  • 将 null 值视为空元素的 XmlSerializer

    我正在编写一个小型 C 应用程序 它需要能够以 XML 形式读取 写入一些配置数据 我通过创建一些简单的模型类来做到这一点 其属性具有XmlElement在需要的地方添加属性 并通过一个XmlSerializer 我想要XmlSeriali
  • DBSCAN 算法可以创建少于 minPts 的簇吗?

    我刚刚编写了 DBSCAN 算法 我想知道 DBSCAN 算法是否可以允许集群中的点数少于所使用的 minPts 参数 我一直在使用http people cs nctu edu tw rsliang dbscan testdatagen
  • 在 kableExtra 表中合并迷你图

    我正在尝试创建一个带有副标题和迷你图的表格 我可以创建带有副标题的表格kableExtra包裹 我可以创建一个带有迷你图的表格formattable and sparkline包裹 但是 我无法将两者结合起来 有办法吗 我看见this ht
  • Visual Studio v.09 中的 Qt 与 C#/.NET?

    你们中有人有工作经验吗 Qt http en wikipedia org wiki Qt toolkit 和 Visual Studio 中的 C 它是否可能 易于一起使用 我已经搜索了 Qt 的 C 绑定 但所有项目似乎都已被放弃 我正在
  • python“导入错误:无法导入名称 urandom”

    不知何故 我的 python 被破坏并发出错误 jseidel EDP15 etc default python c import random Traceback most recent call last File
  • Windows 右键单击​​上下文菜单 + 子菜单

    如何在 Windows 上下文菜单中创建子菜单条目 我可以创建主菜单 但我也想关联一些子菜单 此外 如何将图标关联到菜单项 None
  • 使用 Ruby on Rails 的范围滑块

    使用Ruby on Rails 我的滑块代码如下 这给了我滑块如下 但我想要范围滑块 如下所示 它有两个滑块并给出两个值 something sliderjquery 方法 我在 ruby 中的代码应该是什么来显示滑块 如第二张图所示 我认
  • 如何使用 php mysqli 将事件的实时时间插入数据库?

    我正在尝试添加检查记录更改的日期时间 我在表中使用日期时间数据类型 date added datetime DEFAULT 0000 00 00 00 00 00 我使用以下 php 内置函数用于查询中的日期时间列 date Y m d H
  • ionic update-notifier-cordova.json' 您无权访问此文件

    我试图在 iOS 上运行 ionic 但它抛出一个错误 发生了什么 ionic run ios usr local lib node modules cordova node modules update notifier node mod
  • 检查图像文件类型

    我正在尝试向我的网站添加一个功能 用户可以将其个人资料图片设置为来自外部网址的图像 而不是将其保存到他们的电脑 然后将其上传到我的服务器 这是我到目前为止所想出的 filename inputs image url if getimages
  • Rails simple_form 属性需要标记 (*)

    我在我的应用程序中使用简单表单 我想删除 指示我的所有表单 现有表单和尚未创建的表单 都需要一个属性 我尝试过设置simple form rb Whether attributes are required by default or no
  • 在 C# 中使用 SetFilePointer 使堆栈不平衡

    好的 我在 NET 4 0 中使用 C 中的 SetFilePointer 函数 下面是我用来调用这个函数的 dllimports DllImport Kernel32 dll SetLastError true CharSet CharS
  • 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 w