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

Pandas函数传参:整表还是仅需列的小表更高效?

优先传入仅含目标列的小DataFrame(Pandas 2.2.0)

针对你的场景,从长期性能和内存效率来看,传入仅包含name和id两列的小DataFrame是更优的选择,尤其当未来处理大规模数据时,这种优势会被显著放大,具体原因如下:

1. 内存与拷贝成本优化

Pandas中df[['name','id']]的列选择操作,在Pandas 2.0+的默认配置下(尤其是启用Arrow后端时),很多时候是创建原数据的视图而非完整拷贝,但即便触发拷贝,小DataFrame的内存占用仅为全量DataFrame的1/10(你的场景是20列取2列),内存开销的降低会直接减少GC(垃圾回收)的压力,避免不必要的内存带宽消耗——在百万行甚至千万行级别的数据下,这种差异会非常明显。

2. 缓存命中率提升

CPU处理数据时会优先从高速缓存加载数据,小DataFrame的列数据在内存中更紧凑,能让更多目标数据被加载到缓存中,减少缓存miss的概率。你的函数需要遍历name和id列生成列表,紧凑的数据布局会大幅提升遍历和转换的效率,而全量DataFrame的无关列会占用缓存空间,拖慢核心逻辑的执行速度。

3. 避免意外风险与逻辑清晰性

传入小DataFrame能明确函数的依赖范围,避免未来函数修改时不小心引入对其他列的依赖,同时也能减少因误操作无关列导致的性能损耗或错误,让代码逻辑更清晰、更易维护。

修正后的代码示例

注意你的代码示例2中最后传入函数的还是全量df,正确的写法应该是:

df = Datareader('file')
small_df = df[['name', 'id']]
final_list = Calc_funct(small_df)

大规模数据测试建议

如果想直观验证差异,可以用timeit生成百万级测试数据对比耗时:

import pandas as pd
import numpy as np
import timeit

# 生成100万行20列的测试数据
def create_test_data():
    return pd.DataFrame({
        'name': [f'name_{i}' for i in range(1_000_000)],
        'id': [f'id_{i}' for i in range(1_000_000)],
        **{f'col_{j}': np.random.rand(1_000_000) for j in range(18)}
    })

# 全量DataFrame传入的函数
def calc_func_full(df):
    result = []
    for name, id_val in zip(df['name'], df['id']):
        result.append(name.upper() if name else f"ID_{id_val}")
    return result

# 小DataFrame传入的函数
def calc_func_small(small_df):
    result = []
    for name, id_val in zip(small_df['name'], small_df['id']):
        result.append(name.upper() if name else f"ID_{id_val}")
    return result

df = create_test_data()
small_df = df[['name', 'id']]

# 执行10次测试并打印耗时
print("全量DataFrame耗时:", timeit.timeit(lambda: calc_func_full(df), number=10))
print("小DataFrame耗时:", timeit.timeit(lambda: calc_func_small(small_df), number=10))

测试结果会显示小DataFrame的耗时明显低于全量,数据规模越大,差距越显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:09:53