利用DeepSeek編寫驗證xlsx格式文件中是否啟用sharedStrings.xml對讀寫效率影響python程序

讓他分別用100*10000個單元格有100、1000、10000個不同的1-200字符長的大寫英文字母字符串測試.
一開始DeepSeek沒有找到啟用sharedStrings.xml的寫xlsx模塊,我自己找了pyxlsbwriter的例子告訴他才改好的。

import os
import time
import random
import string
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import matplotlib.pyplot as plt
import numpy as np
from pyxlsbwriter import XlsxWriterdef generate_random_string(length):"""生成指定長度的大寫英文字母隨機字符串"""return ''.join(random.choices(string.ascii_uppercase, k=length))def create_test_data(rows, cols, unique_strings):"""創建測試數據rows: 行數cols: 列數unique_strings: 不同字符串的數量"""# 生成唯一字符串池string_pool = [generate_random_string(random.randint(1, 200)) for _ in range(unique_strings)]# 創建數據矩陣data = []for i in range(rows):row = []for j in range(cols):# 從字符串池中隨機選擇一個字符串row.append(random.choice(string_pool))data.append(row)return datadef write_excel_with_shared_strings(data, filename):"""使用shared strings寫入Excel文件(使用pyxlsbwriter庫確保生成sharedStrings.xml)"""# 使用XlsxWriter創建xlsx文件,默認會使用shared stringswith XlsxWriter(filename, compressionLevel=6) as writer:writer.add_sheet("Sheet1")writer.write_sheet(data)    def write_excel_without_shared_strings(data, filename):"""不使用shared strings寫入Excel文件(轉換為pandas DataFrame再保存)"""df = pd.DataFrame(data)df.to_excel(filename, index=False, header=False)def read_excel(filename):"""讀取Excel文件并測量時間"""start_time = time.time()df = pd.read_excel(filename, header=None)end_time = time.time()return end_time - start_time, dfdef test_scenario(rows, cols, unique_strings, output_dir="test_results"):"""測試一個場景:特定行、列和唯一字符串數量的情況"""if not os.path.exists(output_dir):os.makedirs(output_dir)# 創建測試數據print(f"生成測試數據: {rows}行 x {cols}列, {unique_strings}個唯一字符串")data = create_test_data(rows, cols, unique_strings)# 測試啟用shared strings的情況with_shared_file = os.path.join(output_dir, f"with_shared_{rows}_{cols}_{unique_strings}.xlsx")start_time = time.time()write_excel_with_shared_strings(data, with_shared_file)with_shared_write_time = time.time() - start_timewith_shared_read_time, with_shared_df = read_excel(with_shared_file)with_shared_size = os.path.getsize(with_shared_file)# 測試不啟用shared strings的情況without_shared_file = os.path.join(output_dir, f"without_shared_{rows}_{cols}_{unique_strings}.xlsx")start_time = time.time()write_excel_without_shared_strings(data, without_shared_file)without_shared_write_time = time.time() - start_timewithout_shared_read_time, without_shared_df = read_excel(without_shared_file)without_shared_size = os.path.getsize(without_shared_file)# 驗證數據一致性assert with_shared_df.equals(without_shared_df), "兩種方式保存的數據不一致!"# 返回結果return {'rows': rows,'cols': cols,'unique_strings': unique_strings,'with_shared_write_time': with_shared_write_time,'with_shared_read_time': with_shared_read_time,'with_shared_size': with_shared_size,'without_shared_write_time': without_shared_write_time,'without_shared_read_time': without_shared_read_time,'without_shared_size': without_shared_size}def main():"""主函數"""# 測試配置rows = 100cols = 10000unique_strings_list = [100, 1000, 10000, 100000]results = []# 運行測試for unique_strings in unique_strings_list:result = test_scenario(rows, cols, unique_strings)results.append(result)# 打印當前測試結果print(f"\n測試結果 (唯一字符串數: {unique_strings}):")print(f"啟用shared strings - 寫入時間: {result['with_shared_write_time']:.2f}s, "f"讀取時間: {result['with_shared_read_time']:.2f}s, "f"文件大小: {result['with_shared_size']/1024/1024:.2f}MB")print(f"禁用shared strings - 寫入時間: {result['without_shared_write_time']:.2f}s, "f"讀取時間: {result['without_shared_read_time']:.2f}s, "f"文件大小: {result['without_shared_size']/1024/1024:.2f}MB")# 繪制結果圖表plot_results(results)def plot_results(results):from pylab import mpl# 設置顯示中文字體mpl.rcParams["font.sans-serif"] = ["SimSun"]# 設置正常顯示符號mpl.rcParams["axes.unicode_minus"] = False"""繪制測試結果圖表"""unique_strings = [r['unique_strings'] for r in results]# 創建圖表fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(12, 10))# 寫入時間對比with_shared_write_times = [r['with_shared_write_time'] for r in results]without_shared_write_times = [r['without_shared_write_time'] for r in results]ax1.plot(unique_strings, with_shared_write_times, 'o-', label='啟用shared strings')ax1.plot(unique_strings, without_shared_write_times, 'o-', label='禁用shared strings')ax1.set_xlabel('唯一字符串數量')ax1.set_ylabel('寫入時間 (秒)')ax1.set_title('寫入時間對比')ax1.legend()ax1.grid(True)# 讀取時間對比with_shared_read_times = [r['with_shared_read_time'] for r in results]without_shared_read_times = [r['without_shared_read_time'] for r in results]ax2.plot(unique_strings, with_shared_read_times, 'o-', label='啟用shared strings')ax2.plot(unique_strings, without_shared_read_times, 'o-', label='禁用shared strings')ax2.set_xlabel('唯一字符串數量')ax2.set_ylabel('讀取時間 (秒)')ax2.set_title('讀取時間對比')ax2.legend()ax2.grid(True)# 文件大小對比with_shared_sizes = [r['with_shared_size']/1024/1024 for r in results]without_shared_sizes = [r['without_shared_size']/1024/1024 for r in results]ax3.plot(unique_strings, with_shared_sizes, 'o-', label='啟用shared strings')ax3.plot(unique_strings, without_shared_sizes, 'o-', label='禁用shared strings')ax3.set_xlabel('唯一字符串數量')ax3.set_ylabel('文件大小 (MB)')ax3.set_title('文件大小對比')ax3.legend()ax3.grid(True)# 總時間對比with_shared_total_times = [r['with_shared_write_time'] + r['with_shared_read_time'] for r in results]without_shared_total_times = [r['without_shared_write_time'] + r['without_shared_read_time'] for r in results]ax4.plot(unique_strings, with_shared_total_times, 'o-', label='啟用shared strings')ax4.plot(unique_strings, without_shared_total_times, 'o-', label='禁用shared strings')ax4.set_xlabel('唯一字符串數量')ax4.set_ylabel('總時間 (秒)')ax4.set_title('總時間 (寫入+讀取) 對比')ax4.legend()ax4.grid(True)plt.tight_layout()plt.savefig('shared_strings_performance_comparison.png', dpi=300)plt.show()# 打印詳細結果表格print("\n詳細測試結果:")print("唯一字符串數 | 啟用shared寫入時間 | 禁用shared寫入時間 | 啟用shared讀取時間 | 禁用shared讀取時間 | 啟用shared文件大小 | 禁用shared文件大小")for r in results:print(f"{r['unique_strings']:>12} | {r['with_shared_write_time']:>17.2f} | {r['without_shared_write_time']:>17.2f} | "f"{r['with_shared_read_time']:>17.2f} | {r['without_shared_read_time']:>17.2f} | "f"{r['with_shared_size']/1024/1024:>17.2f} | {r['without_shared_size']/1024/1024:>17.2f}")if __name__ == "__main__":main()

執行結果

生成測試數據: 100行 x 10000列, 100個唯一字符串測試結果 (唯一字符串數: 100):
啟用shared strings - 寫入時間: 0.91s, 讀取時間: 2.70s, 文件大小: 1.60MB
禁用shared strings - 寫入時間: 10.37s, 讀取時間: 9.21s, 文件大小: 12.16MB
生成測試數據: 100行 x 10000列, 1000個唯一字符串測試結果 (唯一字符串數: 1000):
啟用shared strings - 寫入時間: 0.89s, 讀取時間: 2.94s, 文件大小: 2.24MB
禁用shared strings - 寫入時間: 11.71s, 讀取時間: 9.52s, 文件大小: 53.34MB
生成測試數據: 100行 x 10000列, 10000個唯一字符串測試結果 (唯一字符串數: 10000):
啟用shared strings - 寫入時間: 0.85s, 讀取時間: 2.97s, 文件大小: 3.29MB
禁用shared strings - 寫入時間: 12.11s, 讀取時間: 9.60s, 文件大小: 64.52MB
生成測試數據: 100行 x 10000列, 100000個唯一字符串測試結果 (唯一字符串數: 100000):
啟用shared strings - 寫入時間: 3.10s, 讀取時間: 3.77s, 文件大小: 9.54MB
禁用shared strings - 寫入時間: 12.65s, 讀取時間: 9.96s, 文件大小: 66.06MB

結果顯示禁用shared strings時寫入更慢且文件更大,而啟用時文件更小且寫入更快,隨著唯一字符串數量增加,啟用shared strings的效率下降,不啟用沒有變化。驗證了shared strings在重復字符串場景下的存儲優化效果。

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

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

相關文章

【C++框架#2】gflags 和 gtest 安裝使用

spdlog 安裝和使用 1. 概述 介紹:spdlog 是一個高性能、超快速、零配置的 C 日志庫,它旨在提供簡潔的 API 和豐富的功能,同時保持高性能的日志記錄。它支持多種輸出目標、格式化選項、線程安全以及異步日志記錄。 github 鏈接:htt…

平衡掌控者-游戲數值戰斗設計

一、有效生命值1、計算公式有效生命生命值/(1-傷害減免率)/(1-閃避率)2、前搖和后搖對數值來說,戰斗由兩大模塊組成,一個是戰斗公式生效前的戰斗攻擊流程,一個是戰斗公式與自身流程。比如說&…

使用DataLoader加載本地數據 食物分類案例

目錄 一.食物分類案例 1..整合訓練集測試集文檔 2.導入相關的庫 3.設置圖片數據的格式轉換 3.數據處理 4.數據打包 5.定義卷積神經網絡 6.創建模型 7.訓練和測試方法定義 8.損失函數和優化器 9.訓練模型,測試準確率 10.測試模型 之前我們DataLoader加載…

從零開始的python學習——函數(2)

? ? ? ? ? づ?ど 🎉 歡迎點贊支持🎉 個人主頁:勵志不掉頭發的內向程序員; 專欄主頁:python學習專欄; 文章目錄 前言 一、變量作用域 二、函數執行過程 三、鏈式調用 四、嵌套調用 五、函數遞歸 六、…

RAG 的完整流程是怎么樣的?

RAG(檢索增強生成)的完整流程可分為5個核心階段:數據準備:清洗文檔、分塊處理(如PDF轉文本切片);向量化:使用嵌入模型(如BERT、BGE)將文本轉為向量&#xff1…

研發文檔版本混亂的根本原因是什么,怎么辦

研發文檔版本混亂的根本原因通常包括缺乏統一的版本控制制度、團隊協作不暢、文檔管理工具使用不當以及項目需求頻繁變化等因素。這些問題使得研發團隊在日常工作中容易出現文檔版本混亂的情況,導致信息的不一致性、溝通不暢以及開發進度的延誤。為了解決這一問題&a…

ChartView的基本使用

Qt ChartView(準確類名 QChartView)是 Qt Charts 模塊里最常用的圖表顯示控件。一句話概括:“它把 QChart 畫出來,并自帶縮放、平移、抗鋸齒等交互能力”。QML ChartView 簡介(一句話先記住:ChartView 是 Q…

系統擴展策略

1、核心指導思想:擴展立方體 在討論具體策略前,先了解著名的擴展立方體(Scale Cube),它定義了三種擴展維度: X軸:水平復制(克隆) 策略:通過負載均衡器&#…

HBuilder X 4.76 開發微信小程序集成 uview-plus

簡介 本文記錄了在HBuilder中創建并配置uni-app項目的完整流程。 首先創建項目并測試運行,確認無報錯后添加uView-Plus組件庫。 隨后修改了main.js、uni.scss、App.vue等核心文件,配置manifest.json并安裝dayjs、clipboard等依賴庫。 通過調整vite.c…

第4章:內存分析與堆轉儲

本章概述內存分析是 Java 應用性能調優的核心環節之一。本章將深入探討如何使用 VisualVM 進行內存分析,包括堆內存監控、堆轉儲生成與分析、內存泄漏檢測以及內存優化策略。通過本章的學習,你將掌握識別和解決內存相關問題的專業技能。學習目標理解 Jav…

面經分享一:分布式環境下的事務難題:理論邊界、實現路徑與選型邏輯

一、什么是分布式事務? 分布式事務是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于不同的分布式系統的不同節點之上。 一個典型的例子就是跨行轉賬: 用戶從銀行A的賬戶向銀行B的賬戶轉賬100元。 這個操作包含兩個步驟: 從A賬戶扣減100元。 向B賬戶…

C++的演化歷史

C是一門這樣的編程語言: 兼顧底層計算機硬件系統和高層應用抽象機制從實際問題出發,注重零成本抽象、性能、可移植性、與C兼容語言特性和細節很多,學習成本較高,是一門讓程序員很難敢說精通的語言 C是自由的,支持5種…

Qt6實現繪圖工具:12種繪圖工具全家桶!這個項目滿足全部2D場景

項目概述 一個基于Qt框架開發的專業繪圖工具,實現了完整的2D圖形繪制、編輯和管理功能。該項目采用模塊化設計,包含圖形繪制、圖層管理、命令模式撤銷重做、用戶界面等多個子系統,是學習現代C++和Qt框架的最佳實踐。 核心功能特性 12種專業繪圖工具 多圖層繪制系統 完整的…

Linux驅動開發學習筆記

第1章 Linux驅動開發的方式mmap映射型設計方法。【不推薦】將芯片上的物理地址映射到用戶空間的虛擬地址上,用戶操作虛擬地址來操作硬件。使用文件操作集(file_operatiopns)設計方法。【極致推薦】platfrom總線型設置方法。【比較流行】設備樹。【推薦】第2章 Linux…

mac中進行適用于IOS的靜態庫構建

前沿: 進行C開發完成之后,需要將代碼編譯成靜態庫,并且在IOS的手機系統中執行,因此記錄該實現過程. 1主要涉及內容 1.1 整體文件架構 gongyonglocalhost Attention % tree -L 2 . ├── build │ ├── __.SYMDEF │ ├── cmake_install.cmake │ ├── CMakeCache…

C++二維數組的前綴和

C二維數組的前綴和的方法很簡單&#xff0c;可以利用公式res[i][j]arr[i][j]res[i-1][j]prefix[i][j-1]-res[i-1][j-1]。輸入4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16輸出1 3 6 10 6 14 24 36 15 33 54 78 28 60 96 136#include<bits/stdc.h> using namespace std; int…

Wifi開發上層學習1:實現一個wifi搜索以及打開的app

Wifi開發上層學習1&#xff1a;實現一個wifi搜索以及打開的app 文章目錄Wifi開發上層學習1&#xff1a;實現一個wifi搜索以及打開的app背景demo實現1.添加系統權限以及系統簽名2.布局配置3.邏輯設計3.1 wifi開關的實現3.2 wifi掃描功能3.3 連接wifi總結一、WiFi 狀態控制接口二…

【DSP28335 入門教程】定時器中斷:為你的系統注入精準的“心跳”

大家好&#xff0c;歡迎來到 DSP28335 的核心精講系列。我們已經掌握了如何通過外部中斷來響應“外部事件”&#xff0c;但系統內部同樣需要一個精準的節拍器來處理“內部周期性任務”。單純依靠 DELAY_US() 這樣的軟件延時&#xff0c;不僅精度差&#xff0c;而且會在延時期間…

從零開始:用代碼解析區塊鏈的核心工作原理

區塊鏈技術被譽為信任的機器&#xff0c;它正在重塑金融、供應鏈、數字身份等眾多領域。但對于許多開發者來說&#xff0c;它仍然像一個神秘的黑盒子。今天&#xff0c;我們將拋開炒作的泡沫&#xff0c;深入技術本質&#xff0c;用大約100行Python代碼構建一個簡易的區塊鏈&am…

網絡通信IP細節

目錄 1.通信的NAT技術 2.代理服務器 3.內網穿透和內網打洞 1.通信的NAT技術 NAT技術產生的背景是我們為了解決IPV4不夠用的問題&#xff0c;NAT在通信的時候可以對IP將私網IP轉化為公網IP&#xff0c;全局IP要求唯一&#xff0c;但是私人IP不是唯一的。 將報文發給路由器進行…