Cython 优化

2024-04-11

我正在用 Python 编写一个相当大的模拟,并希望从 Cython 获得一些额外的性能。然而,对于下面的代码,我似乎没有得到那么多,即使它包含一个相当大的循环。大约 10 万次迭代。

我是否犯了一些初学者错误,或者这个循环大小是否太小而无法产生大效果? (在我的测试中,Cython 代码仅快 2 倍左右)。

import numpy as np;
cimport numpy as np;
import math

ctypedef np.complex64_t cpl_t
cpl = np.complex64

def example(double a, np.ndarray[cpl_t,ndim=2] A):

    cdef int N = 100

    cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl)

    cdef Py_ssize_t n, m;
    for n in range(N):
        for m in range(N):

            if np.sqrt(A[0,n]) > 1:
                B[0,n,m] = A[0,n] + 1j * A[0,m]

    return B;

您应该使用编译器指令。我用Python写了你的函数

import numpy as np

def example_python(a, A):
    N = 100
    B = np.zeros((3,N,N),dtype = np.complex)
    aux = np.sqrt(A[0])
    for n in range(N):
        if aux[n] > 1:
            for m in range(N):
                B[0,n,m] = A[0,n] + 1j * A[0,m]
return B

在 Cython 中(您可以了解编译器指令here http://docs.cython.org/src/reference/compilation.html#compiler-directives)

import cython
import numpy as np
cimport numpy as np

ctypedef np.complex64_t cpl_t
cpl = np.complex64

@cython.boundscheck(False) # compiler directive
@cython.wraparound(False) # compiler directive
def example_cython(double a, np.ndarray[cpl_t,ndim=2] A):

    cdef int N = 100
    cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl)
    cdef np.ndarray[float, ndim=1] aux
    cdef Py_ssize_t n, m
    aux = np.sqrt(A[0,:]).real
    for n in range(N):
        if aux[n] > 1.:
            for m in range(N):
                B[0,n,m] = A[0,n] + 1j * A[0,m]
    return B

我比较了这两个函数

c = np.array(np.random.rand(100,100)+1.5+1j*np.random.rand(100,100), dtype=np.complex64)

%timeit example_python(100, c)
10 loops, best of 3: 61.8 ms per loop

%timeit example_cython(100, c)
10000 loops, best of 3: 134 µs per loop

在这种情况下,Cython 比 Python 快约 450 倍。

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

Cython 优化 的相关文章

随机推荐

  • 在 C - linux 中强制使用原始串行模式

    不知道如何表述标题 但我想做的是用我的 Linux PC 测试我的微控制器 以确保数据正确 经过几个小时的搜索 我发现 stty 命令可以更改通过串行端口管理数据的方式 并且事实证明 默认情况下 如果从端口接收到 xon 或 xoff 字符
  • Spring集成流程的优雅关闭

    我从 spring 集成监控示例中了解到https github com spring projects spring integration samples tree master intermediate monitoring http
  • 有没有一种方法可以捕获异常而无需创建变量?

    在 PHP 中 我有时会使用 try catch 捕获一些异常 try catch Exception e Nothing this is a test that an exception is thrown 通过这种代码 我最终得到了变量
  • 修改存储在变量中的innerHTML不起作用

    我想将页面的显示区域存储在变量中 display在代码中 即innerHTMLdisplaydiv 在我的示例中 但是当我这样做时 我根本无法修改其内容 function stored var display document getEle
  • TEdit 中的 CapsLock 密码消息在视觉上因 VCL 样式而失败

    使用 VCL 样式时 在 TEdit 中使用密码时的 CapsLock 消息会出现错误 这是没有样式的样子 VCL 样式打开 该消息是葡萄牙语的 但我认为这不重要 在 Delphi Seattle 23 0 21418 4207 带有更新
  • 为什么Python中'=='出现在'in'之前? [复制]

    这个问题在这里已经有答案了 下面的代码输出 False 而根据 Python 操作顺序 它应该输出 True 顺序应该是 gt 而不是相反 为什么 出现在 in 之前 y 33 3 in y True Output False 现有的答案提
  • 比较两个字符串是否相等的超级快速方法

    显然 在Python中检查两个字符串是否相等你可以这样做 hello word hello world 但是 如果您要比较很长的字符串 超过 100 万个字符 怎么办 python 中是否有内置方法或任何库可以更快地完成此操作 也许利用卡普
  • 过滤器有问题

    我有课程搜索一切正常 除了 当 r gt price它返回所有课程 而不是最后搜索的课程 我需要捕获最后一个 时间 然后按它过滤价格 我怎样才能做到这一点 courses Course when r gt mainCat function
  • 用户订单(买入/卖出)的股票期权价格变化

    继这个问题生成虚构的股票期权价格变化 https stackoverflow com questions 9353938 generate a fictitious stock option price variation 我希望模拟价格变
  • MySQL 命令行中的 Unicode 转义序列

    简洁版本 可以使用哪种转义序列在命令行 mysql 中搜索 unicode 字符 长版 我正在寻找一种方法 从命令行在 mysql 中搜索包含 unicode 序列 U 200B 的记录的列 我不知道该使用哪种逃避方式 我已经尝试过并且x2
  • 让表示层(JSF)处理来自服务层(EJB)的业务异常

    更新提供的实体的 EJB 方法 使用 CMT Override SuppressWarnings unchecked public boolean update Entity entity throws OptimisticLockExce
  • 为什么 debug_backtrace() 使用这么多内存?

    当尝试跟踪 PHP 中的一些内存问题时 我注意到debug backtrace 我在日志代码中调用它 似乎使用了大量内存 在大多数情况下 以下代码会打印类似的内容0 02 MB 但在一种情况下 它会打印171 85 MB before me
  • 从 Docker 中的 Python 访问 GCP Secret Manager 中的机密 - nontsop 权限被拒绝

    我正在构建一个简单的应用程序 它将 Twilio 凭据存储在 GCP Secret Manager 中 并在需要时将其拉下 但是 我在项目资源上不断收到拒绝权限错误 403 google api core exceptions Permis
  • 浏览器用户代理样式表边距 8px

    我只是想知道网站周围的空白区域 我发现它是因为用户代理样式表 Google Chrome 而存在的 并且默认为 body 标签设置了 8px 的边距 如何解决这个问题不是问题 但我对这个余量的原因感兴趣 我搜索了它 但我只找到了将边距设置为
  • urllib2 文件名

    如果我使用 urllib2 打开文件 如下所示 remotefile urllib2 urlopen http example com somefile zip 除了解析原始 URL 之外 是否有一种简单的方法来获取文件名 编辑 将打开的文
  • FlexSlider 2 在窗口大小调整时调整大小

    我正在为基于 Twitter Bootstrap 的 WordPress 制作响应式主题 我正在使用弹性滑块 http energized danyduchaine com 主页上的幻灯片 jquery 插件 不幸的是 当我调整浏览器大小时
  • 尝试在 webdriver.io 项目中打开 allure-reports 时出现异常 java.lang.UnsatisfiedLinkError

    我有一个小型 webdriver io 项目 只是为了第一次尝试它 我现在想添加诱惑报告 但是当我尝试运行时allure open我收到以下异常 但我不知道必须在哪里解决此问题 Starting web server 2021 05 04
  • Flutter 等效 Android-Toggle-Switch

    有任何像这样的扑动小部件吗这个图书馆 https github com BelkaLab Android Toggle Switch在 android java 中
  • XIB 文件在 XCode 中像 XML 一样打开,但使用 Interface Builder 可以正确打开

    当我在 Xcode 4 中双击 StartWindow xib 文件时 它不会在集成 Interface Builder 中打开 它像 XML 文件一样打开 我可以打开所有其他 xib 文件 它们会按预期显示 我可以通过 打开方式 使用旧的
  • Cython 优化

    我正在用 Python 编写一个相当大的模拟 并希望从 Cython 获得一些额外的性能 然而 对于下面的代码 我似乎没有得到那么多 即使它包含一个相当大的循环 大约 10 万次迭代 我是否犯了一些初学者错误 或者这个循环大小是否太小而无法