使用np.float64时Python内核崩溃,切换为float32正常,求原因
问题原因与解决方案
核心问题:无限递归导致内核崩溃
你定义的round函数存在无限递归的致命问题:
- 当输入参数
x的类型是np.float64时,函数内部调用了round(x),但这里调用的不是Python内置的round,而是你自己定义的这个同名函数 - 每次调用都会重复进入判断逻辑,不断递归调用自身,瞬间耗尽内存导致内核崩溃
为什么float32时无错误?
当x的dtype是float32时,不满足x.dtype == np.float64的判断条件,函数直接返回x,不会触发递归逻辑,因此不会出现崩溃问题。
修复方案
解决方法很简单,避免递归调用自己的函数,明确指向Python内置的round即可,有两种常见方式:
方式1:重命名自定义函数(推荐)
避免和内置函数重名,从根源上解决冲突:
def custom_round(x): if x.dtype == np.float64: return round(x) # 这里调用的是Python内置round else: return x
方式2:明确调用内置round函数
如果不想改名,可以直接引用内置函数:
def round(x): if x.dtype == np.float64: return __builtins__.round(x) # 显式指定调用内置round else: return x
补充说明
当你在DataFrame上应用这个函数时,pandas会对每个元素执行函数逻辑。对于float64类型的元素,每一次处理都会触发无限递归,栈深度迅速超过上限,最终导致内核崩溃;而float32元素的处理不会进入递归分支,因此流程正常。
内容的提问来源于stack exchange,提问作者Who_amI
相关产品推荐
相关产品推荐

