You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入编译后的Cython函数时触发ValueError问题求助

问题:Cython编译后导入出现numpy二进制不兼容错误

代码片段

# distutils: language = c
# cython: language_level=3

cimport numpy as np 
import numpy as np

cdef extern from "math.h":
    double sqrt(double x)

def sigma_update(double sigma, double sigmamax, double sigmamin, double prim_win, double dual_win, int iter, int innerop):
    cdef double sigmascale = 5.0
    cdef int sigma_update_iter, i
    cdef np.ndarray[np.float64_t, ndim=1] sigma_array = np.array([sigma])
    cdef np.ndarray[np.float64_t, ndim=1] prim_win_array = np.array([prim_win])
    cdef np.ndarray[np.float64_t, ndim=1] dual_win_array = np.array([dual_win])
    
    if iter < 10:
        sigma_update_iter = 1
    elif iter < 20:
        sigma_update_iter = 2
    elif iter < 200:
        sigma_update_iter = 2
    elif iter < 500:
        sigma_update_iter = 3
    else:
        sigma_update_iter = 3
    
    if innerop == 1:
        sigmascale = sqrt(5.0)
    
    if iter % sigma_update_iter == 0:
        if prim_win > max(1, 1.2*dual_win):
            prim_win = 0.0
            sigma = min(sigmamax, sigma*sigmascale)
        elif dual_win > max(1, 3*prim_win):
            dual_win = 0.0
            sigma = max(sigmamin, 2*sigma/sigmascale)
    
    return np.array([sigma]), np.array([prim_win]), np.array([dual_win])

错误信息

ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 96 from C header, got 80 from PyObject.

环境信息

  • Cython版本:0.29.34
  • NumPy版本:1.20.3

解决方案

  • 彻底清理编译产物:删除所有编译生成的.c、.so(Windows下为.pyd)文件,以及build目录,重新执行编译命令。旧的编译文件可能基于不同版本NumPy生成,导致运行时不兼容。
  • 显式指定NumPy头文件路径:在setup.py中明确引入当前环境的NumPy include路径,确保编译时使用正确的头文件。示例代码:
    from setuptools import setup
    from Cython.Build import cythonize
    import numpy as np
    
    setup(
        ext_modules=cythonize("your_module.pyx"),
        include_dirs=[np.get_include()]
    )
    
  • 版本适配调整:
    • 尝试升级Cython到3.x版本(注意Cython 3.x对部分旧语法有调整,需同步修改代码,比如cimport numpy的方式)
    • 或降级NumPy到1.19.x系列,该版本与Cython 0.29.x的兼容性经过更多验证
  • 确认编译与运行环境一致:确保编译时使用的虚拟环境和运行时完全相同,避免跨环境使用不同版本的NumPy导致的不匹配。
  • 移除冗余代码:代码中声明的sigma_array、prim_win_array、dual_win_array变量未被实际使用,直接删除这些变量的定义,减少不必要的NumPy C API依赖。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:02:21