让他分别用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不是唯一的。 将报文发给路由器进行…