如何生成含百万条元组的pandas DataFrame 并优化现有生成代码速度
优化百万行DataFrame生成代码的可行方案
原有代码的核心性能瓶颈来自循环内逐行调用
pd.concat拼接:每次concat都会重新分配内存拷贝全量数据,时间复杂度为O(n²),百万次拼接的额外开销远高于数据生成本身,是性能浪费的核心来源。
以下是可落地的优化方案,整体性能可提升百倍以上:
- 优先摒弃逐行生成再拼接的逻辑,先批量生成所有列的全量数据,再一次性传入
pd.DataFrame构造函数,内存仅分配一次,时间复杂度直接降到O(n) - 把逐次调用的Python原生随机函数替换为numpy向量化批量随机接口,
np.random.choice、np.random.uniform的执行效率比循环调用random.choice、random.SystemRandom().uniform高10~100倍。如果确实需要加密安全级别的随机数,也优先选择对应库的批量生成接口,避免循环调用 - 可以在构造DataFrame时直接指定index参数为生成好的SalesDate列,省去后续单独调用
set_index的额外遍历开销
优化后的参考代码:
import numpy as np import pandas as pd # 定义生成行数 n_rows = 1000000 # 批量生成所有列数据 sales_date_col = np.random.choice(SalesDates, size=n_rows) sales_district_col = np.random.choice(district, size=n_rows) product_sold_col = np.random.choice(product, size=n_rows) sales_amount_col = np.random.uniform(1, 5000, size=n_rows) # 一次性构建DataFrame并直接指定索引,省去后续set_index开销 df = pd.DataFrame({ "SalesDistrict": sales_district_col, "ProductSold": product_sold_col, "SalesAmount": sales_amount_col }, index=sales_date_col) # 如果需要保留SalesDate为普通列同时设置索引,再额外执行df["SalesDate"] = sales_date_col即可
内容的提问来源于stack exchange,提问作者Dennis Kwone
相关产品推荐
相关产品推荐

