Cython 中的内存视图排序

2023-11-25

如何在 Cython 中对内存视图进行就地排序?有没有内置函数可以做到这一点?现在我必须使用numpy数组代替并使用numpy的排序,这非常慢。


为了跟进我的评论,这里有 3 个选项(numpy 和 C 和 C++ 标准库选项)

from libcpp.algorithm cimport sort
from libc.stdlib cimport qsort

import numpy as np

def sort_numpy(double[:] a, kind):
    np.asarray(a).sort(kind=kind)

# needs to be compiled with C++        
def sort_cpp(double[::1] a):
    # a must be c continuous (enforced with [::1])
    sort(&a[0], (&a[0]) + a.shape[0])

# The C version requires a comparator function
# which is a little slower since it requires calling function pointers
# and passing pointers rather than numbers
cdef int cmp_func(const void* a, const void* b) nogil:
    cdef double a_v = (<double*>a)[0]
    cdef double b_v = (<double*>b)[0]
    if a_v < b_v:
        return -1
    elif a_v == b_v:
        return 0
    else:
        return 1

def sort_c(double[:] a):
    # a needn't be C continuous because strides helps
    qsort(&a[0], a.shape[0], a.strides[0], &cmp_func)

您的结果将取决于您使用的 C/C++ 标准库,因此不要过多解读我的结果。对于 1000 个长数组(排序 5000 次),我得到:

np quick:  0.11296762199890509
np merge:  0.20624926299933577
np heap:  0.2944786230000318
c++:  0.12071316699984891
c:  0.33728832399901876

即 numpy 版本是最快的。对于 100 长的数组我得到

np quick:  0.022608489000049303
np merge:  0.023513408999860985
np heap:  0.024136934998750803
c++:  0.008449130998997134
c:  0.01909676999821386

即,如果您要对大量小数组进行排序,则调用 numpy sort 的开销很大,您应该使用 C++(或者可能是 C)。如果您要对大型数组进行排序,您可能会发现很难击败 numpy。

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

Cython 中的内存视图排序 的相关文章

随机推荐

  • 您可以在 irb 会话中自动在每个命令中“要求”ruby 文件吗?

    我当前正在编辑一个文件 并使用 irb 来测试 api gt require file rb gt o Object new gt o method 然后我希望能够编辑 file rb 并能够立即看到更改 示例 假设当我第一次需要 file
  • 包管理器名称未找到异常

    我是安卓编程新手 我使用 Eclipse 以及 MainActivity java 和 ClassFragment java 文件创建了一个应用程序 ClassFragment 是一个片段 我正在使用新更新的 appcompat 库 我只想
  • GLSL:关于相干限定符

    我没明白如何coherent限定符和原子操作一起工作 我使用以下代码在同一 SSBO 位置上执行一些累积操作 uint prevValue newValue uint readValue ssbo index do prevValue re
  • Blazor:没有会话/JWT 令牌时重定向到登录页面?

    我正在尝试在 Blazor 中创建一个新应用程序并正在进行身份验证 我正在使用存储在本地存储中的 JWT 令牌 当应用程序加载时 我需要检查存储中是否有令牌 如果是这样 请将其添加到所有 API 请求的 HTTP 标头中 如果不是 则在页面
  • 在 Swift 中旋转 UIImage

    我正在使用 Xcode 6 0 1 和 Swift 我有一个 UIImage 我想使用旧图像作为源来制作另一个图像 新图像以某种方式旋转 比如说垂直翻转 这个问题已经有答案了几个月前 然而 即使情况相同 该解决方案对我不起作用 当我有 va
  • Application.OnKey 无法正确重置

    I am trying to help another user in this forum reference The goal is to use the Enter key on the numeric keypad to trigg
  • Python、Matplotlib、绘制多线(数组)和动画

    我开始使用 Python 和 OOP 编程 但我在 Fortran 90 95 和 Matlab 编程方面拥有丰富的经验 我正在 tkinter 环境上使用动画开发一个小工具 该工具的目标是对多行进行动画处理 数组而不是数据向量 下面是我的
  • 如何读取 emscripten 编译库中用户指定的文件?

    我目前正在开发一个带有 emscripten 编译支持的 C 文件解析库 它从用户处获取文件路径 在其中读取二进制文件并解析它 据我所知 emscripten 不支持直接加载文件 而是使用虚拟文件系统 有没有办法将给定路径上的文件加载到虚拟
  • 如何使用 swift 隐藏 QLPreviewController 中的共享按钮?

    我使用下面的代码来使用 QLPreviewcontroller 在我的应用程序中显示一些文档 let ql QLPreviewController ql dataSource self ql navigationItem rightBarB
  • 如何使用配置文件提供程序插件从 Jenkins 管道内的配置文件读取属性

    我想用一个简单的属性配置文件参数化我的 Jenkins 管道 skip tests true 我已将其添加到 Jenkins 配置文件管理中 在我的管道中 我导入此文件并尝试使用 Jenkins 管道配置文件插件读取它 node my sw
  • 混合模式程序集未加载本机 C++ pdb 的符号

    我正在使用 C CLI 中的混合模式程序集 在混合模式组装中成功时 所有托管模式组装的 pdb 都会被加载 但即使本机 pdb 的信息显示在 模块 窗格中 即在 VS 调试 gt Windows gt 模块中 也不会加载本机 dll 和 p
  • 计算Javascript中两个日期之间的工作日(节假日除外)

    我有一个 javascript 函数 它计算两个日期之间的工作日 它可以工作 但问题是它不考虑假期 如何修改此函数 例如通过在异常数组中添加假期 在互联网上搜索了这个问题 但没有找到有关假期例外的信息 例如假期数组 var holidays
  • 附加模板字符串

    是否可以将模板字符串附加到 div 中 我正在尝试优化我的代码 目前我的代码必须创建元素 添加类 添加文本节点 然后将所有内容附加在一起 我想知道是否可以只创建一个模板字符串然后附加它 以提高效率 我不想用innerHTML 擦除当前div
  • 默认参数为泛型类型

    我有用 Swift 编写的协议及其实现 protocol P struct A P 协议用作某些功能的泛型类型 func foo
  • 如何确定是否由于共享冲突而引发 IOException?

    我有一个 C 应用程序 我想将文件复制到新位置 有时我需要覆盖现有文件 当发生这种情况时 我收到 System IO IOException 我想从共享冲突中恢复 但如何确定返回 IOException 是因为目标文件正在使用而不是其他原因
  • ggmap中的动态数据点标签定位

    我正在使用 R 中的 ggmap 包 并且对地理空间数据可视化相对较新 我有一个由十一个纬度和经度对组成的数据框 我想将其绘制在地图上 每个纬度和经度对都有一个标签 这是虚拟数据 lat lt c 47 597157 47 656322 4
  • 在发现“EntityFrameworkConfiguration”类型之前使用默认的 DbConfiguration 实例

    public class EntityFrameworkConfiguration DbConfiguration public EntityFrameworkConfiguration this SetModelCacheKey ctx
  • Google Pub/Sub 的 RetryPolicy 中配置的指数退避如何工作?

    The cloud google com go pubsub最近发布的库 在 v1 5 0 中 参见https github com googleapis google cloud go releases tag pubsub 2Fv1 5
  • 我可以重命名 numpy 记录数组中的字段吗

    我是 python 新手 所以这听起来可能很基础 我已经使用 csv2rec 导入了 csv 文件 第一行有标题 我想将标题更改为 x y z 这样做的最佳方法是什么 gt gt gt import matplotlib gt gt gt
  • Cython 中的内存视图排序

    如何在 Cython 中对内存视图进行就地排序 有没有内置函数可以做到这一点 现在我必须使用numpy数组代替并使用numpy的排序 这非常慢 为了跟进我的评论 这里有 3 个选项 numpy 和 C 和 C 标准库选项 from libc