与 C 数组相比,带有 NumPy 数组内存视图的 Cython 性能较差

2024-07-04

我遇到了一个非常奇怪的结果基准 http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day4_python_cython_numba.ipynb?create=1

这些都是冒泡排序实现的不同风格,n=10^4 时最快的方法是在内部将 Python 列表转换为 C 数组。相反,黄线对应于我将 NumPy 数组与内存视图一起使用的代码。我预计结果会是相反的。我(和同事)重复了几次基准测试,但总是得到相同的结果。也许有人知道这里发生了什么......

图中的黑线对应于代码:

%%cython
cimport cython
from libc.stdlib cimport malloc, free

def cython_bubblesort_clist(a_list):
    """ 
    The Cython implementation of bubble sort with internal
    conversion between Python list objects and C arrays.

    """
    cdef int *c_list
    c_list = <int *>malloc(len(a_list)*cython.sizeof(int))
    cdef int count, i, j # static type declarations
    count = len(a_list)

    # convert Python list to C array
    for i in range(count):
        c_list[i] = a_list[i]

    for i in range(count):
        for j in range(1, count):
            if c_list[j] < c_list[j-1]:
                c_list[j-1], c_list[j] = c_list[j], c_list[j-1]

    # convert C array back to Python list
    for i in range(count):
        a_list[i] = c_list[i]

    free(c_list)
    return a_list

以及这段代码的粉色线:

%%cython
import numpy as np
cimport numpy as np
cimport cython
def cython_bubblesort_numpy(long[:] np_ary):
    """ 
    The Cython implementation of bubble sort with NumPy memoryview.

    """
    cdef int count, i, j # static type declarations
    count = np_ary.shape[0]

    for i in range(count):
        for j in range(1, count):
            if np_ary[j] < np_ary[j-1]:
                np_ary[j-1], np_ary[j] = np_ary[j], np_ary[j-1]

    return np.asarray(np_ary)

正如上面评论中所建议的,我添加了装饰器

%%cython
import numpy as np
cimport numpy as np
cimport cython
@cython.boundscheck(False) 
@cython.wraparound(False)
cpdef cython_bubblesort_numpy(long[:] np_ary):
    """ 
    The Cython implementation of bubble sort with NumPy memoryview.

    """
    cdef int count, i, j # static type declarations
    count = np_ary.shape[0]

    for i in range(count):
        for j in range(1, count):
            if np_ary[j] < np_ary[j-1]:
                np_ary[j-1], np_ary[j] = np_ary[j], np_ary[j-1]

    return np.asarray(np_ary)

结果现在更符合我的预期:)

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

与 C 数组相比,带有 NumPy 数组内存视图的 Cython 性能较差 的相关文章

随机推荐

  • SerializeObject 抛出 System.OutOfMemoryException

    我对 JsonConvert SerializeObject 有一个严重的问题我需要序列化超过500 000条字典记录才能使序列化抛出以下错误 System OutOfMemoryException 我尝试在 foreach 中单独序列化每
  • GWT 无法从 Hibernate 序列化我的对象

    这是我收到的错误 我到处寻找答案 但我无法弄清楚为什么其他人没有遇到同样的问题 当我从 Hibernate 检索 Proposal 对象时 会发生错误 该对象在作者和顾问这两个属性上具有 User Info 多对一约束 如果需要 我可以提供
  • 以编程方式将项目添加到相对布局

    我一直在到处寻找这个问题的答案 我是 Android 新手 尝试通过 java 而不是 xml 以编程方式将项目添加到相对布局 我创建了一个测试类来尝试一下 但项目不断堆叠而不是正确格式化 我现在只想将一个 TextView 放在另一个下面
  • OpenCL 中的重叠传输和设备计算

    我是 OpenCL 的初学者 我很难理解某些东西 我想改进主机和设备之间的图像传输 我制定了一个计划来更好地了解我 顶部 我现在拥有的 下图 我想要的 HtD 主机到设备 和DtH 设备到主机 是内存传输 K1 和 K2 是内核 我考虑过使
  • 使用 v8::Locker 的正确方法是什么?为什么必须使用它?

    我正在尝试使用 NDK 将 v8 嵌入到 Android 应用程序中 我有一个看起来像这样的 JNI 模块 未显示 JNI 映射代码 include
  • 我可以显示托管在 bitbucket 上的 Ipython 笔记本吗?

    我有一个非常简单的笔记本 托管在 github 和 bitbucket 上 这github 网址 https github com thomas haslwanter statsintro blob master ipynb demo ip
  • 具有 EditText 材质设计的工具栏

    我正在尝试制作带有 EditText 的工具栏 如下所示 现在我可以做一些类似的事情 但只能使用静态标题 有什么想法可以开始吗 我已经这样做了 如下所示 有Toolbar as AppBar aka ActionBar 位于顶部 其下方的第
  • Numpy,沿数组维度应用函数列表

    我有一个类型的函数列表 func list lambda x function1 input lambda x function2 input lambda x function3 input lambda x x 和形状为 4 200 2
  • 在 MacOS X 上安装 Node.js、nvm 和 npm 的推荐方法是什么?

    我正在尝试使用Homebrew https brew sh越多越好 推荐的安装方式是什么Node js https nodejs org en nvm https github com nvm sh nvm and npm https ww
  • 如何使用 Linq 对通用集合进行分页?

    我有一个 System Generic Collections List Of MyCustomClass 类型对象 给定整数变量 pagesize 和 pagenumber 如何仅查询 MyCustomClass 对象的任何单个页面 如果
  • 如何将 char 指针转换为 int 指针

    我想投射一个指针pc它将 char 指向一个点pi它指向 int char pc int pi pi int pc compiler complaint about old style cast pi static cast
  • KSQL 是否支持 Kafka 流处理保证?

    我想知道KSQL是否支持https docs confluence io current streams concepts html processing guarantees https docs confluent io current
  • 为唯一字段显示 Django 错误消息

    我想更改当重复条目尝试保存时的默认错误消息 而它们应该是唯一的 即unique True 很像这样 email models EmailField unique True error messages unique This email h
  • 确定字符串是否为有效的浮点值

    有没有一种方法可以简单地检查字符串值是否是有效的浮点值 如果字符串不是数值 则对字符串调用 to f 会将其转换为 0 0 当传递一个无效的浮点字符串时 使用 Float 会引发异常 该字符串更接近我想要的 但我不想处理捕获异常 我真正想要
  • 如何创建看起来与 ContextMenu 完全相同的对话框?

    有时使用标准活动方法来创建上下文菜单并不方便 因为一个活动中可能有很多地方 但在不同的类中 需要显示上下文菜单 但从任何地方创建对话框都很容易 如何创建看起来与 ContextMenu 完全相同的对话框 我在哪里可以找到标准上下文菜单的布局
  • 如何检测安装的Chrome版本?

    我正在开发一个 Chrome 扩展程序 我想知道是否有一种方法可以检测用户正在使用哪个版本的 Chrome 获取 Chrome 的主要版本作为整数 function getChromeVersion var raw navigator us
  • 剥离功能未按预期工作

    def sstrip a b raw input enter the string to be stripped off i a strip b print i k raw input enter the string sstrip k o
  • 为什么 Python 中的元组不可变? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 python 字符串和元组是不可变的 https stackoverflow com questions 1538663 why are python strings and tuples a
  • 查找数据框中前 n 行的总和

    我想找到前面的总和n数据框中的行 例如 id 1 10 vals c 4 7 2 9 7 0 4 6 1 8 test data frame id vals So for n 3 我想将下一列计算为 test sum c NA NA 13
  • 与 C 数组相比,带有 NumPy 数组内存视图的 Cython 性能较差

    我遇到了一个非常奇怪的结果基准 http nbviewer ipython org github rasbt One Python benchmark per day blob master ipython nbs day4 python