当前位置: 首页 > 知识库问答 >
问题:

cython中函数内部的数组可以有多大的限制?

终翰学
2023-03-14

这段代码编译和运行得很好:

cdef enum:
    SIZE = 1000000
cdef int ar[SIZE]
cdef int i

for i in range(SIZE):
    ar[i] = i
print(ar[5])

但是这段代码:

cdef enum:
    SIZE = 1000000
    
def test():
    cdef int ar[SIZE]
    cdef int i

    for i in range(SIZE):
        ar[i] = i
    print(ar[5])
    
test()

使python内核崩溃(我正在使用jupyter Magic运行它)。

函数内部的数组大小是否有限制?如果有,是否有办法取消该限制?

共有1个答案

耿志义
2023-03-14

在第一种情况下,数组是一个全局变量,它是静态定义的普通C数组,在堆上分配。在第二种情况下,在堆栈上分配局部变量数组。问题是堆栈有一个固定的最大大小(通常类似于2个MiB,但在不同的平台上可能会有很大的变化)。如果您试图写入超出堆栈限制的分配内容,如果幸运的话,您会遇到崩溃或很好的堆栈溢出错误。请注意,函数调用和局部变量临时占用堆栈中的一些空间。虽然堆栈的大小可以调整,但最好的解决方案是对相对较大的数组或大小可变的数组使用动态分配。希望在Cython中可以使用malloc和free(请参阅文档),但要小心不要忘记free(也不要两次释放数组)。另一种解决方案是创建一个Numpy阵列,然后使用内存视图(这成本更高,但可以防止任何可能的泄漏)。

 类似资料:
  • 我是新的< code>Sinon。我无法窥探私有的< code>ajax函数 注意:我已经尝试了下面的对象示例。它像魅力一样工作。 我在期间收到如下错误

  • 问题内容: 我正在尝试引用函数内部的数组。 像这样:和是的数组。 这不会编译,我只能用于函数参数吗?如果是这样,我该如何在函数内进行引用/指针? 问题答案: 只能用于将变量作为参数传递给函数。因此,最简单的解决方案可能是在函数内部使用一个辅助函数: 您 可以使用以下命令 创建对数组的引用: 但是此解决方案有两个问题: 创建一个非所有者引用,因此编译器可能会决定在仍使用该引用的同时取消分配数组。 数

  • 问题内容: 码: 输出: 为什么以这种方式打印? 问题答案: 当您在运行时调用多态方法时,Java使用特殊的数据结构来决定需要调用哪个类的方法。在构造对象时,即 在执行用户提供的任何构造函数和初始化程序代码之前,都会 建立此结构。 创建时,在输入的构造函数 之前 已准备好“何时调用,则需要调用或” 的数据结构。由于此结构是为类准备的,因此即使调用代码在内部的构造函数中,它也指向。这就是为什么您看到

  • 我想显示产品浏览历史,所以我将产品id存储在浏览器cookie中。 因为历史记录列表仅限于5项,所以我将cookie值转换为一个数组,然后检查它的长度并删除多余的内容。 下面的代码是我尝试过的,但它不起作用;数组项没有被删除。 我想问一下,如何限制数组长度,使其只能存储5个项目? 或 如何在数组索引4之后剪切项目?

  • 问题内容: 我知道JavaScript函数可以接受“任意”数量的参数。 但是我想知道实际上有多少个“任何”个数是否有限制? 例如,假设我向提出了一百万个论点。那行得通吗?还是口译员会翻身? 我猜测最大值是(a)特定于实现的(b),因为对象是类似数组的。 我在语言规范中没有看到这一点,但是可能没有连接点。 问题答案: 尽管没有具体限制规范中参数的理论最大数目这些限制是完全依赖于实现的,最有可能,也将

  • 我试图运行一个简单的mapdb示例,但出现了以下错误: 我的班级: 我的pomx.xml 我跑得很快-