Cython 中 numpy 数组掩码的性能

2023-12-25

作为这个问题的后续here https://stackoverflow.com/questions/45882166/performance-of-updating-multiple-key-value-pairs-in-a-dict(感谢 MSeifert 的帮助)我遇到了必须屏蔽 numpy 数组的问题new_values带有索引数组new_vals_idx在传递掩码数组进行更新之前val_dict.

对于旧帖子中 MSeifert 的回答中提出的解决方案,我尝试应用数组屏蔽,但性能并不令人满意。
我用于以下示例的数组和字典是:

import numpy as np
val_dict = {'a': 5.0, 'b': 18.8, 'c': -55/2}
for i in range(200):
    val_dict[str(i)] = i
    val_dict[i] = i**2

keys = ('b', 123, '89', 'c')  # dict keys to update
new_values = np.arange(1, 51, 1) / 1.0  # array with new values which has to be masked
new_vals_idx = np.array((0, 3, 5, -1))  # masking array
valarr = np.zeros((new_vals_idx.shape[0]))  # preallocation for masked array
length = new_vals_idx.shape[0]

为了使我的代码片段更容易与我的旧问题进行比较,我将坚持 MSeifert 答案的函数命名。这些是我尝试从 python/cython 中获得最佳性能的尝试(由于性能太差,其他答案被省略):

def old_for(val_dict, keys, new_values, new_vals_idx, length):
    for i in range(length):
        val_dict[keys[i]] = new_values[new_vals_idx[i]]
%timeit old_for(val_dict, keys, new_values, new_vals_idx, length)
# 1000000 loops, best of 3: 1.6 µs per loop

def old_for_w_valarr(val_dict, keys, new_values, valarr, new_vals_idx, length):
    valarr = new_values[new_vals_idx]
    for i in range(length):
        val_dict[keys[i]] = valarr[i]
%timeit old_for_w_valarr(val_dict, keys, new_values, valarr, new_vals_idx, length)
# 100000 loops, best of 3: 2.33 µs per loop

def new2_w_valarr(val_dict, keys, new_values, valarr, new_vals_idx, length):
    valarr = new_values[new_vals_idx].tolist()
    for key, val in zip(keys, valarr):
        val_dict[key] = val
%timeit new2_w_valarr(val_dict, keys, new_values, valarr, new_vals_idx, length)
# 100000 loops, best of 3: 2.01 µs per loop

Cython 功能:

%load_ext cython
%%cython
import numpy as np
cimport numpy as np
cpdef new3_cy(dict val_dict, tuple keys, double[:] new_values, int[:] new_vals_idx, Py_ssize_t length):
    cdef Py_ssize_t i
    cdef double val  # this gives about 10 µs speed boost compared to directly assigning it to val_dict
    for i in range(length):
        val = new_values[new_vals_idx[i]]
        val_dict[keys[i]] = val
%timeit new3_cy(val_dict, keys, new_values, new_vals_idx, length)
# 1000000 loops, best of 3: 1.38 µs per loop

cpdef new3_cy_mview(dict val_dict, tuple keys, double[:] new_values, int[:] new_vals_idx, Py_ssize_t length):
    cdef Py_ssize_t i
    cdef int[:] mview_idx = new_vals_idx
    cdef double [:] mview_vals = new_values
    for i in range(length):
        val_dict[keys[i]] = mview_vals[mview_idx[i]]
%timeit new3_cy_mview(val_dict, keys, new_values, new_vals_idx, length)
# 1000000 loops, best of 3: 1.38 µs per loop

# NOT WORKING:
cpdef new2_cy_mview(dict val_dict, tuple keys, double[:] new_values, int[:] new_vals_idx, Py_ssize_t length):
    cdef double [new_vals_idx] masked_vals = new_values
    for key, val in zip(keys, masked_vals.tolist()):
        val_dict[key] = val

cpdef new2_cy_mask(dict val_dict, tuple keys, double[:] new_values, valarr, int[:] new_vals_idx, Py_ssize_t length):
    valarr = new_values[new_vals_idx]
    for key, val in zip(keys, valarr.tolist()):
        val_dict[key] = val

Cython 函数new3_cy and new3_cy_mview似乎并没有比old_for。通过valarr避免函数内部的数组构造(因为它将被调用数百万次)甚至似乎会减慢速度。
掩蔽new2_cy_masknew_vals_idxCython 中的 array 给我错误:“指定的内存视图索引无效,类型 int[:]”。有没有类似的类型Py_ssize_t对于索引数组?
尝试在中创建一个屏蔽内存视图new2_cy_mview给我错误'无法将类型'double [:]'分配给'double [__pyx_v_new_vals_idx]''。是否有类似屏蔽内存视图之类的东西?我无法找到有关此主题的信息...

将计时结果与我的旧问题的计时结果进行比较,我猜数组屏蔽是占用大部分时间的过程。由于它很可能已经在 numpy 中进行了高度优化,因此可能不需要做太多事情。但速度下降如此之大,以至于必须(希望)有更好的方法来做到这一点。
任何帮助表示赞赏!提前致谢!


在当前构造中可以做的一件事是关闭边界检查(如果安全的话!)。不会产生巨大的差异,但会增加一些性能。

%%cython
import numpy as np
cimport numpy as np
cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)
cpdef new4_cy(dict val_dict, tuple keys, double[:] new_values, int[:] new_vals_idx, Py_ssize_t length):
    cdef Py_ssize_t i
    cdef double val  # this gives about 10 µs speed boost compared to directly assigning it to val_dict
    for i in range(length):
        val = new_values[new_vals_idx[i]]
        val_dict[keys[i]] = val

In [36]: %timeit new3_cy(val_dict, keys, new_values, new_vals_idx, length)
1.76 µs ± 209 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [37]: %timeit new4_cy(val_dict, keys, new_values, new_vals_idx, length)
1.45 µs ± 31.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cython 中 numpy 数组掩码的性能 的相关文章

  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • for 循环如何评估其参数

    我的问题很简单 Does a for循环评估它每次使用的参数 Such as for i in range 300 python 是否会为此循环的每次迭代创建一个包含 300 个项目的列表 如果是的话 这是避免这种情况的方法吗 lst ra
  • 希伯来语中的稀疏句子标记化错误

    尝试对希伯来语使用稀疏句子标记 import spacy nlp spacy load he doc nlp text sents list doc sents I get Warning no model found for he Onl
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • `list()` 被认为是一个函数吗?

    list显然是内置类型 https docs python org 3 library stdtypes html list在Python中 我看到底下有一条评论this https stackoverflow com a 53645813
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • Pandas style.bar 颜色基于条件?

    如何渲染其中一列的 Pandas dfstyle bar color属性是根据某些条件计算的 Example df style bar subset before after color ff781c vmin 0 0 vmax 1 0 而
  • 解析根元素内元素之间的 XML 文本

    我正在尝试用 Python 解析 XML 以下是 XML 结构的示例 a aaaa1 b bbbb b aaaa2 a
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • Python 通过从现有 csv 文件中过滤选定的行来写入新的 csv 文件

    只是一个问题 我试图将 csv 文件中的选定行写入新的 csv 文件 但出现错误 我试图读取的 test csv 文件是这样的 两列 2013 9 1 2013 10 2 2013 11 3 2013 12 4 2014 1 5 2014
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa

随机推荐

  • Postgres 与 Java 我无法插入数据

    我尝试使用 Java 向我的 postgres 数据库插入数据 我的本地数据库有默认配置 我想将一些数据放入表中 但遇到一些问题 这是代码 import java sql Connection import java sql DriverM
  • BindingExpressionBase 在自定义 MarkupExtension 中为 null

    我有一个CustomMarkupExtension班级 绑定正在工作 null 但是BindingExpressionBase总是null 有人可以解释一下为什么吗 我需要得到BindingExpressionBase打电话给UpdateT
  • 我可以为 html 元素设置默认的 css 类吗

    如果我定义了一个 css 类 是否可以将该类设置为 html 元素的默认类 为了澄清这一点 我希望分解出类的定义 以便它可以被一个或多个 css 选择器使用 或者在 html 中谨慎应用 例如 myclass float right h1
  • Actionscript 3.0:范围

    教程通常不涉及 Actionscript 中的范围 您能给我指出一些文档和 或解释一下我应该了解什么吗 我想避免由于某些类在某些地方不可见而引起的问题 这些应该有帮助 功能范围 http livedocs adobe com flex 3
  • 调整应用程序窗口大小时,如何调整应用程序内的图像大小?

    当我最大化应用程序时 JPanel 内的图像不会随之调整大小 如何在窗口最大化时调整 JPanel 及其内容 编辑 我正在使用 BufferedImage 这是一个开放式问题 您想要缩放以填充或缩放以适合区域还是您不关心纵横比 填充比例和适
  • South 忽略 Python / Django 中字段默认值的更改

    为什么 South 无法识别 Python 模型中默认字段值的更改 例如 以向南迁移的现有模型为例 class MyFamily models Model family size models IntegerField verbose na
  • Phonegap 谷歌分析根本不跟踪

    这是我的 main js 文件 Google Analytics function var ga document createElement script ga type text javascript ga async true ga
  • 在运行时更改 DataGridView 标题文本

    我能够在运行时更改所有控件文本 预计我的 DataGridViews 标题文本不会更改 colName HeaderText FormOtherRes Crc I tried DataGridView1 Refresh 但这没有用 当我调试
  • 不在数据构造函数范围内

    我有两个 hs 文件 一个包含新类型声明 另一个使用它 首先 hs module first where type S SetType data SetType S Integer 第二个 hs module second where im
  • 维基百科是否允许通过 Google App Engine 获取 URL?

    我正在编写一个 Python Web 应用程序 我计划在其中利用维基百科 当尝试一些 URL 获取代码时 我能够获取 Google 和 Facebook 通过 Google App Engine 服务 但是当我尝试获取 wikipedia
  • 从 XML 中选择节点,其属性之一包含特定字符串

    我试图选择在其属性之一中包含给定字符串的节点 但似乎我只能在某个属性上执行此操作 var tempUsers xmlDocument selectNodes Users contains Id TEXT 我想我可以写一些其他的东西来代替 I
  • java web start 应用程序可以在没有 .jnlp 文件的情况下存在吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 正如中所解释的Java网络启动 ht
  • jQuery 模糊() 不起作用?

    这里完全被难住了 尝试一些很简单的事情 但它不起作用 input input1 textarea input1 focus function this addClass input2 removeClass input1 input inp
  • canvasContext.fillRect 在 Firefox 中抛出 NS_ERROR_FAILURE 异常

    我试图在页面顶部绘制一个巨大的画布矩形 某种灯箱背景 代码非常简单 var el document createElement canvas el style position absolute el style top 0 el styl
  • Future.get() 总是被 InterruptedException 中断

    我在 Java 中的 Future get 遇到了一个奇怪的问题 它总是返回一个 InterruptedException 但奇怪的是异常的原因是 null 所以我不知道是谁打断了我 情况变得更糟 因为我在调用 get 之前进行检查 而 F
  • 如何从 Spring MVC 控制器返回对象以响应 AJAX 请求?

    我必须从控制器返回员工列表以响应 jQuery AJAX 请求 我该怎么办呢 我的控制器 RequestMapping phcheck public ModelAndView pay RequestParam empid int empid
  • Linq:在进行投影时设置属性

    我正在做一个简单的 GroupBy 获取第一个元素 但我想修改每个结果的一个属性 class M public string Name get set public int NOfPeopleWithTheSameName get set
  • React 中的 JQuery 移动组件

    React 中的 JQuery 移动组件 我对这个概念还很陌生 仍然需要弄清楚 我构建了一个用于移动目的的应用程序 并决定将其包装在 React 组件中 我的代码 索引 html
  • 加密部署 .NET 的配置文件

    我有一个从 app config 读取的 Windows 服务 我希望对某些设置进行加密 但是 我不想使用 NET 中提供的 ProtectedConfigurationProvider 类 因为它们使用 DPAPI 根据运行的计算机来加密
  • Cython 中 numpy 数组掩码的性能

    作为这个问题的后续here https stackoverflow com questions 45882166 performance of updating multiple key value pairs in a dict 感谢 M