gpt4 book ai didi

numpy - 出于分析目的了解 Numpy 内部结构

转载 作者:行者123 更新时间:2023-12-04 19:36:31 26 4
gpt4 key购买 nike

分析一段 numpy 代码表明我大部分时间都花在这两个函数上

numpy/matrixlib/defmatrix.py.__getitem__:301
numpy/matrixlib/defmatrix.py.__array_finalize__:279

这是Numpy来源:
  • https://github.com/numpy/numpy/blob/master/numpy/matrixlib/defmatrix.py#L301
  • https://github.com/numpy/numpy/blob/master/numpy/matrixlib/defmatrix.py#L279

  • 问题 #1:
    __getitem__ 似乎每次我使用类似 my_array[arg] 的东西时都会被调用,如果 arg 不是整数而是切片,它会变得更加昂贵。有没有办法加快对数组切片的调用?

    例如。在
    for i in range(idx): res[i] = my_array[i:i+10].mean()

    问题 #2:
    __array_finalize__ 什么时候被调用,我怎样才能通过减少对这个函数的调用次数来加快速度?

    谢谢!

    最佳答案

    您不能使用矩阵,而只能使用 2d numpy 数组。我通常只在短时间内使用矩阵来利用乘法的语法(但在数组上添加 .dot 方法后,我发现我越来越少这样做了)。

    但是,对于您的问题:

    1) __getitem__ 真的没有捷径,除非 defmatrix 覆盖了 __getslice__ 它可以做但还没有。有 .item 和 .itemset 方法,它们针对整数获取和设置进行了优化(并返回 Python 对象而不是 NumPy 的数组标量)

    2) 每当创建数组对象(或子类)时都会调用 __array_finalize__。它是从 C 函数调用的,每个数组创建都会通过它。 https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/ctors.c#L1003

    在纯 Python 定义的子类的情况下,它从 C 回调到 Python 解释器,这有开销。如果矩阵类是内置类型(例如,基于 Cython 的 cdef 类),则调用可以避免 Python 解释器开销。

    关于numpy - 出于分析目的了解 Numpy 内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428566/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com