利用pypy加速pyxlsbwriter生成xlsb文件

上文介紹了python通過DuckDB和pyxlsbwriter模塊生成xlsb文件,因為python是解釋執行,它的速度有點慢,pypy是另一種python解釋器,它使用即時編譯(JIT)技術來提高執行速度。
因為DuckDB與pypy不兼容,所以讓DeepSeek幫助編寫了不依賴DuckDB和pandas,直接使用python csv模塊將csv文件內容寫入多sheet的xlsb文件的程序。
源代碼csv2xlsb.py如下:

import csv
import math
from pyxlsbwriter import XlsbWriterdef csv_to_xlsb(csv_file,output_file,sheet_prefix="Sheet",max_rows_per_sheet=1048575,  # XLSB 單 Sheet 最大行數compression_level=6,has_header=True
):"""將大型 CSV 文件分 Sheet 寫入 XLSB 文件參數:csv_file (str): 輸入 CSV 文件路徑output_file (str): 輸出 XLSB 文件路徑sheet_prefix (str): Sheet 名稱前綴max_rows_per_sheet (int): 每個 Sheet 最大行數compression_level (int): 壓縮級別(0-9)has_header (bool): CSV 是否包含標題行"""# 首先計算總行數(為了確定需要的 Sheet 數量)with open(csv_file, 'r', newline='', encoding='utf-8') as f:total_rows = sum(1 for _ in csv.reader(f)) - (1 if has_header else 0)num_sheets = math.ceil(total_rows / max_rows_per_sheet)print(f"CSV 文件共有 {total_rows} 行數據,將分成 {num_sheets} 個 Sheet 寫入")with XlsbWriter(output_file, compressionLevel=compression_level) as writer:with open(csv_file, 'r', newline='', encoding='utf-8') as f:csv_reader = csv.reader(f)# 讀取標題行(如果有)headers = next(csv_reader) if has_header else Nonecurrent_sheet = 0current_row = 0sheet_data = []# 添加標題行到第一個 Sheetif headers:sheet_data.append(headers)for row in csv_reader:sheet_data.append(row)current_row += 1# 當達到最大行數時寫入當前 Sheet 并創建新 Sheetif current_row >= max_rows_per_sheet:# 寫入當前 Sheetsheet_name = f"{sheet_prefix}_{current_sheet + 1}"writer.add_sheet(sheet_name)writer.write_sheet(sheet_data)print(f"已寫入 Sheet: {sheet_name},行數: {len(sheet_data)}")# 準備下一個 Sheetcurrent_sheet += 1current_row = 0sheet_data = []if headers:  # 新 Sheet 也包含標題行sheet_data.append(headers)# 寫入最后一個 Sheet(可能未達到最大行數)if sheet_data:sheet_name = f"{sheet_prefix}_{current_sheet + 1}"writer.add_sheet(sheet_name)writer.write_sheet(sheet_data)print(f"已寫入 Sheet: {sheet_name},行數: {len(sheet_data)}")if __name__ == "__main__":# 示例用法csv_to_xlsb(csv_file="5m Sales Records.csv",output_file="sheets.xlsb",sheet_prefix="Data",max_rows_per_sheet=1048575,  # 每個 Sheet 100 萬行compression_level=6,has_header=True)

下面是在pypy中安裝pyxlsbwriter并執行的步驟

C:\d\pypy>pypy3 -m ensurepip
Successfully installed pip-24.0 setuptools-65.5.0C:\d\pypy>pypy3 -m pip install pyxlsbwriter
Successfully installed pyxlsbwriter-0.0.3C:\d\pypy>cd ..C:\d>timer64 pypy\pypy3 csv2xlsb.pyKernel  Time =     1.750 =    2%
User    Time =    58.546 =   97%
Process Time =    60.296 =  100%    Virtual  Memory =   3858 MB
Global  Time =    60.271 =  100%    Physical Memory =   3828 MB

我把第一步生成的sheets.xlsb文件改名為pypysheets.xlsb,以便比較。再用python執行同樣的代碼。

C:\d>move sheets.xlsb pypysheets.xlsb
移動了         1 個文件。C:\d>timer64 python csv2xlsb.py
CSV 文件共有 5000000 行數據,將分成 5 個 Sheet 寫入
已寫入 Sheet: Data_1,行數: 1048576
已寫入 Sheet: Data_2,行數: 1048576
已寫入 Sheet: Data_3,行數: 1048576
已寫入 Sheet: Data_4,行數: 1048576
已寫入 Sheet: Data_5,行數: 805701Kernel  Time =     1.640 =    1%
User    Time =    85.218 =   97%
Process Time =    86.859 =   99%    Virtual  Memory =   4728 MB
Global  Time =    87.267 =  100%    Physical Memory =   4724 MB

可見pypy3執行時間比python縮短了三分之一。再比較兩個生成的文件,大小完全一致,再用FC命令比較,發現還是存在差異的。

C:\d>dir *sheets.xlsb2025/08/17  18:32       201,303,180 pypysheets.xlsb
2025/08/17  18:34       201,303,180 sheets.xlsbC:\d>fc /b sheets.xlsb pypysheets.xlsb
正在比較文件 sheets.xlsb 和 PYPYSHEETS.XLSB
024E15D8: 37 F5
024E15D9: 94 93
024E16D0: 37 F5
024E16D1: 94 93
...
0BFFA380: 57 0A
0BFFA3BD: 57 0A
0BFFA3F8: 57 0A

那pypy生成的文件到底對不對,能不能用,還是用rust_sheet插件來讀取,比較如下:
先讀取用python生成的sheets.xlsb

D create table xlsb as from read_sheet('sheets.xlsb',header=1,sheet_name='Data_1')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_2')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_3')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_4')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_5');
100% ▕████████████████████████████████████████████████████████████▏
Run Time (s): real 47.218 user 52.890625 sys 2.437500
D summarize xlsb;
┌────────────────┬─────────────┬─────────────┬────────────────────┬───┬───────┬───────┬─────────┬─────────────────┐
│  column_name   │ column_type │     min     │        max         │ … │  q50  │  q75  │  count  │ null_percentage │
│    varcharvarcharvarcharvarchar       │   │ int32 │ int32 │  int64  │  decimal(9,2)   │
├────────────────┼─────────────┼─────────────┼────────────────────┼───┼───────┼───────┼─────────┼─────────────────┤
│ Region         │ VARCHAR     │ Asia        │ Sub-Saharan Africa │ … │  NULLNULL50000000.00 │
│ Country        │ VARCHAR     │ Afghanistan │ Zimbabwe           │ … │  NULLNULL50000000.00 │
│ Item TypeVARCHAR     │ Baby Food   │ Vegetables         │ … │  NULLNULL50000000.00 │
│ Sales Channel  │ VARCHAR     │ Offline     │ Online             │ … │  NULLNULL50000000.00 │
│ Order Priority │ VARCHAR     │ C           │ M                  │ … │  NULLNULL50000000.00 │
│ Order DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Order ID       │ VARCHAR100000321999999892          │ … │  NULLNULL50000000.00 │
│ Ship DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Units Sold     │ VARCHAR19999               │ … │  NULLNULL50000000.00 │
│ Unit Price     │ VARCHAR109.289.33               │ … │  NULLNULL50000000.00 │
│ Unit Cost      │ VARCHAR117.1197.44              │ … │  NULLNULL50000000.00 │
│ Total Revenue  │ VARCHAR1000003.46999931.76          │ … │  NULLNULL50000000.00 │
│ Total Cost     │ VARCHAR1000.23999979.98          │ … │  NULLNULL50000000.00 │
│ Total Profit   │ VARCHAR100.2499997.92           │ … │  NULLNULL50000000.00 │
├────────────────┴─────────────┴─────────────┴────────────────────┴───┴───────┴───────┴─────────┴─────────────────┤
│ 14 rows                                                                                    12 columns (8 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Run Time (s): real 0.238 user 2.031250 sys 0.140625

再讀取用pypy生成, 改名后的pypysheets.xlsb

D create table xlsb as from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_1')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_2')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_3')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_4')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_5');
100% ▕████████████████████████████████████████████████████████████▏
Run Time (s): real 45.734 user 43.078125 sys 2.531250
D summarize xlsb;
┌────────────────┬─────────────┬─────────────┬────────────────────┬───┬───────┬───────┬─────────┬─────────────────┐
│  column_name   │ column_type │     min     │        max         │ … │  q50  │  q75  │  count  │ null_percentage │
│    varcharvarcharvarcharvarchar       │   │ int32 │ int32 │  int64  │  decimal(9,2)   │
├────────────────┼─────────────┼─────────────┼────────────────────┼───┼───────┼───────┼─────────┼─────────────────┤
│ Region         │ VARCHAR     │ Asia        │ Sub-Saharan Africa │ … │  NULLNULL50000000.00 │
│ Country        │ VARCHAR     │ Afghanistan │ Zimbabwe           │ … │  NULLNULL50000000.00 │
│ Item TypeVARCHAR     │ Baby Food   │ Vegetables         │ … │  NULLNULL50000000.00 │
│ Sales Channel  │ VARCHAR     │ Offline     │ Online             │ … │  NULLNULL50000000.00 │
│ Order Priority │ VARCHAR     │ C           │ M                  │ … │  NULLNULL50000000.00 │
│ Order DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Order ID       │ VARCHAR100000321999999892          │ … │  NULLNULL50000000.00 │
│ Ship DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Units Sold     │ VARCHAR19999               │ … │  NULLNULL50000000.00 │
│ Unit Price     │ VARCHAR109.289.33               │ … │  NULLNULL50000000.00 │
│ Unit Cost      │ VARCHAR117.1197.44              │ … │  NULLNULL50000000.00 │
│ Total Revenue  │ VARCHAR1000003.46999931.76          │ … │  NULLNULL50000000.00 │
│ Total Cost     │ VARCHAR1000.23999979.98          │ … │  NULLNULL50000000.00 │
│ Total Profit   │ VARCHAR100.2499997.92           │ … │  NULLNULL50000000.00 │
├────────────────┴─────────────┴─────────────┴────────────────────┴───┴───────┴───────┴─────────┴─────────────────┤
│ 14 rows                                                                                    12 columns (8 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Run Time (s): real 0.240 user 1.843750 sys 0.343750

讀取時間基本一致,內容也一致。
所以,可以放心利用pypy加速pyxlsbwriter生成xlsb文件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93500.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93500.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略

Spring Boot 集成 MyBatis-Plus 全攻略 1. 為什么選擇 MyBatis-Plus 零侵入:在 MyBatis 基礎上增強,不影響現有功能。內置 CRUD:無需寫 XML/SQL,直接調用 BaseMapper 方法。強大插件:分頁插件、性能分析、樂觀鎖、多租…

LangChain 多任務應用開發

Q: LangChain dify coze是競品關系 都是AI Agent搭建平臺,dify和coze 屬于低代碼,langChain屬于高代碼,coze優于dify Q:向量數據庫是存儲向量,做相似度檢索的,可以用faiss milvus chromdb Q:使用…

實用技巧:Oracle中精準查看表占用空間大小

目錄實用技巧:Oracle中精準查看表占用空間大小一、為什么需要精準統計表空間占用?二、完整查詢SQL:覆蓋表、LOB、索引三、SQL語句關鍵邏輯解析1. 基礎表:dba_tables 與 dba_tablespaces2. 子查詢1:統計表段空間&#x…

openEuler等Linux系統中如何復制移動硬盤的數據

在 openEuler 系統中,提示 “You should mount volume first” ,意思是需要先掛載移動硬盤的分區才能訪問: 安裝必要軟件(針對特殊文件系統) 如果移動硬盤是 NTFS 等非 Linux 原生支持的文件系統格式,需要安裝對應的支持軟件,以掛載 NTFS 格式移動硬盤為例,需要安裝 …

java如何把字符串數字轉換成數字類型

在Java中將字符串數字轉換為數字類型有多種方法,以下是詳細說明和示例代碼: 一、基礎轉換方法 Integer.parseInt() String str "123"; int num Integer.parseInt(str); // 轉換為intDouble.parseDouble() String str "3.14"; dou…

WPFC#超市管理系統(6)訂單詳情、顧客注冊、商品銷售排行查詢和庫存提示、LiveChat報表

WPF&C#超市管理系統10. 訂單詳情10.1 頁面布局10.2 功能實現11. 顧客注冊12. 商品銷售排行查詢與庫存提示14. LiveChart報表總結10. 訂單詳情 10.1 頁面布局 頁面分三行布置,第一行復用OutstorageView界面的第一行,將屬性和命令修改為顧客相關第二…

【Linux】文件基礎IO

1.關于文件的共識原理 1.文件內容屬性 2.文件分為打開的文件和沒打開的文件 3.打開的文件: 文件被打開必須先被加載到內存,所以本質是研究進程和文件的關系,一個進程可以打開多個文件。操作系統內部一定存在大量被打開的文件,要進…

基于微信小程序的生態農產銷售管理的設計與實現/基于C#的生態農產銷售系統的設計與實現、基于asp.net的農產銷售系統的設計與實現

基于微信小程序的生態農產銷售管理的設計與實現/基于C#的生態農產銷售系統的設計與實現、基于asp.net的農產銷售系統的設計與實現

Java研學-SpringCloud(五)

一 Nacos 配置中心 1 引入依賴 – services.pom每個微服務都需要<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2 配置文件 –…

.NET 中的延遲初始化:Lazy<T> 與LazyInitializer

標簽&#xff1a;線程安全、延遲初始化、按需初始化、提升啟動性能 項目地址&#xff1a;NitasDemo/12Lazy/LazyDemo at main Nita121388/NitasDemo 目錄Lazy<T>1. 概念2. 基本用法 3. 異常處理 4. 線程安全模式 5. 示例1. 線程安全模式 (ExecutionAndPublication)2. 發…

【LLIE專題】LLIE低照度圖像結構先驗提取方法

Zero-Shot Day-Night Domain Adaptation with a Physics Prior&#xff08;ICCV,2021&#xff09;專題介紹一、研究背景二、方法1. 物理反射模型與顏色不變特征的推導&#xff08;原理推導、物理依據&#xff09;2. 顏色不變特征的計算&#xff08;特征計算公式整個過程&#x…

Font Awesome Kit 使用詳解

在現代網頁設計中&#xff0c;圖標是提升用戶體驗的關鍵元素。而 Font Awesome 作為最受歡迎的圖標庫&#xff0c;其最新版本 Font Awesome 7 通過 Kit 功能提供了更便捷高效的集成方式。本文將帶你全面了解如何使用 Font Awesome Kit&#xff0c;讓你的網站圖標管理變得輕松高…

第七十八章:AI的“智能美食家”:輸出圖像風格偏移的定位方法——從“濾鏡病”到“大師風范”!

AI圖像風格偏移前言&#xff1a;AI的“火眼金睛”——輸出圖像風格偏移的定位方法&#xff01;第一章&#xff1a;痛點直擊——“畫風跑偏”&#xff1f;AI生成藝術的“審美危機”&#xff01;第二章&#xff1a;探秘“畫風密碼”&#xff1a;什么是風格偏移&#xff1f;它藏在…

Android原生(Kotlin)與Flutter混合開發 - 設備控制與狀態同步解決方案

Kotlin 原生實現 (Android) 1.1 AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.afloia.smartconnect"><applicationandroid:name".MainApplication"android:label"Smart …

已開源:Highcharts.NET,Highcharts Android,與Highcharts iOS集成

近期了解到&#xff0c;Highcharts官方宣布將Highcharts.NET&#xff0c;Highcharts Android&#xff0c;與Highcharts iOS集成轉換為開源。對于Highcharts提供世界一流的數據可視化工具&#xff0c;一直致力于將資源集中在可以為您提供最大價值的地方。官方提到&#xff1a;這…

KingbaseES:一體化架構與多層防護,支撐業務的持續穩定運行與擴展

聲明&#xff1a;文章為本人真實測評博客&#xff0c;非廣告 目錄 引言 一、什么是KingbaseES&#xff1f; 二、KingbaseES核心特性 1. 一鍵遷移&#xff0c;極速性能&#xff0c;安全無憂? 2. 性能強勁&#xff0c;擴展性強&#xff0c;助力企業應對大規模并發挑戰? …

scikit-learn/sklearn學習|廣義線性回歸 Logistic regression的三種成本函數

【1】引言 前序學習進程中&#xff0c;已經對線性回歸和嶺回歸做了初步解讀。 實際上&#xff0c; Logistic regression是一種廣義的線性模型&#xff0c;在對線性分類的進一步學習前&#xff0c;有必要了解 Logistic regression。 【2】Logistic regression的3種成本函數 …

Tiptap(基于 Prosemirror)vs TinyMCE:哪個更適合你的技術棧?

在這之前&#xff0c;先來介紹一下 ProseMirror&#xff1a; 1. ProseMirror 是底層內核 定位&#xff1a;一個強大的 富文本編輯框架/引擎&#xff0c;不是一個成品編輯器。 作者&#xff1a;Marijn Haverbeke&#xff08;CodeMirror 作者&#xff09;。 核心思想&#xff1…

多墨智能-AI一鍵生成工作文檔/流程圖/思維導圖

本文轉載自&#xff1a;多墨智能-AI一鍵生成工作文檔/流程圖/思維導圖 - Hello123工具導航 ** 一、AI 文檔與視覺化創作助手 多墨智能是一款基于人工智能的在線工具&#xff0c;支持一鍵生成專業文檔、流程圖與思維導圖&#xff0c;通過關鍵詞輸入快速完成內容創作&#xff0…

Kafka_Broker_副本基本信息

Kafka副本作用&#xff1a;提高數據可靠性 Kafka默認副本1個&#xff0c;生產環境一般配置為2個&#xff0c;保證數據可靠性&#xff0c;太多副本會增加磁盤存儲空間&#xff0c;增加網絡上數據傳輸&#xff0c;降低效率 Kafka中副本分為&#xff1a;Leader和Follower&#xff…