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

为何Pandas中astype(str)转换整数序列比apply(str)慢得多?

Why is astype(str) slower than apply(str) for converting a pandas Series of integers to strings?

这问题问得太戳痛点了!我当初第一次发现这个差异的时候也懵了——毕竟一直以来都被灌输「向量化方法比apply快」的观念,结果实测数据直接打脸😅。咱们先把你的测试场景再明确下,方便大家理解:

import numpy as np
import pandas as pd
# 创建一个包含100万随机整数的Series
x = pd.Series(np.random.randint(0, 100, 1000000))

# 测试astype(str)的耗时
%timeit x.astype(str)  # 实测约2秒
# 测试apply(str)的耗时
%timeit x.apply(str)   # 实测仅约0.2秒

核心原因:两者底层实现逻辑完全不同

为什么看起来更「专业」的astype(str)反而更慢?关键在于它们处理转换的路径不一样:

  • x.astype(str):通用型转换,冗余开销大
    这个方法本质上依赖numpy的类型转换逻辑,而numpy在处理数值转字符串时,会先做一系列通用型的兼容处理:比如遍历整个数组计算最长的数字字符串长度,创建固定长度的字符串数组(numpy的str_类型),之后再转换为pandas的object类型Series。除此之外,它还需要处理各种边界情况(比如缺失值、不同数值类型的统一转换),这些额外的逻辑在纯整数这种简单场景下,反而变成了不必要的性能开销。

  • x.apply(str):针对性轻量转换,效率更高
    apply(str)的逻辑就简单直接多了——它会对Series里的每一个整数元素,直接调用Python内置的str()函数转成字符串,然后把结果存入object类型的数组中。因为是针对单个整数的轻量操作,不需要额外的统一长度或类型兼容处理,在大数量级的纯整数数组上,速度自然快很多。

那应该调整推荐方案吗?分场景看!

不是说astype(str)就没用了,得根据你的数据情况和需求来选:

  • ✅ 优先用apply(str)的场景:你的Series是纯整数/纯小数,没有缺失值,只需要简单转成对应字符串,不需要特殊格式化规则——这种情况下apply(str)效率更高,完全可以替代astype(str)作为推荐方案。
  • ✅ 适合用astype(str)的场景:如果你的Series包含缺失值、混合数据类型,或者需要统一的格式化规则(比如日期格式、保留小数位数),astype(str)(或者配合dt.strftime()、map()+格式化字符串)会更可靠,能保证转换结果的一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:01