ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1713|回复: 10

[分享] 数组、字典、引用工作表函数直观速度对比(二万行数据随机排序)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-10-6 18:49 | 显示全部楼层 |阅读模式

    我之前有讨论过说工作表函数会很慢,数组是最快的,大家不太相信,之前没有上传附件,这次我把附件上传上来给大家测试。
    这次使用二万行数据进行测试,如下图所示,有A至E列(2万行5列)数据进行随机排序。
1.png

     方法一只用到数组法,不涉及到字典;方法二是数组+字典法,方法三是字典+单元格赋值法;方法四是字典+工作表函数法。结果以上图M2:M4所示。这里能直观的看出来数组的速度,相差10倍多,用单元格赋值其实也慢不了多少,所以一行一行赋值到单元格与一次性赋值这一块是差不了太多的,而引用工作表函数Application.Index(Arr, i)真的会卡死。
    下面是相关的代码:
一、数组法,不用字典
2.png

二、数组+字典法
3.png

三、字典+单元格法
3-1.png

四、字典+工作表函数法
4.png

附件在这里,请大家测试。
字典与数组速度对比(大数据排序).rar (463.7 KB, 下载次数: 106)

以往写的关于速度对比的帖子。
VBA中引用工作表函数,速度会大大降低,不得已就不要引用
https://club.excelhome.net/thread-1672621-1-1.html?_dsign=fc62ec22



几种查询方式速度对比,发现VLOOKUP并不比字典慢
https://club.excelhome.net/thread-1625969-1-1.html?_dsign=5b3b913f

VLOOKUP与字典速度对比(大数据查询).rar (989.17 KB, 下载次数: 66)

TA的精华主题

TA的得分主题

发表于 2023-10-6 20:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个数组法,好像是个洗牌算法

TA的精华主题

TA的得分主题

发表于 2023-10-6 21:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

关于字典的一些浅入分析

数组的速度是>字典的,1亿的数据都不在话下,但字典不行,字典的速度在10万左右把,超过10万之后每多1万的数据速度都会直线下滑,猜测是因为分配的内存不够了,达到临界点需要重新分配内存,所以速度会下降.

建议大数据用哈希表,而不是字典,字典速度在大量数据面前就扑街了
参考我这篇帖子https://club.excelhome.net/threa ... tml?_dsign=05a2fea8

在vba里是数组速度最快,这个是公认的了认为工作表函数快的,只不过是没接触过vba罢了

TA的精华主题

TA的得分主题

发表于 2023-10-7 03:17 来自手机 | 显示全部楼层
caiyu93 发表于 2023-10-6 21:59
数组的速度是>字典的,1亿的数据都不在话下,但字典不行,字典的速度在10万左右把,超过10万之后每多1万的数据 ...

问ai,说是vba的字典hash冲突之后是用链表储存冲突的项目的,所以量大了之后冲突太多,最后就变成遍历的速度了

TA的精华主题

TA的得分主题

发表于 2023-10-7 07:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
数组是写入内存的,当然快了,工作表函数数据量大的时候还是尽量少用吧,和函数一样会卡的要死

TA的精华主题

TA的得分主题

发表于 2023-10-7 12:50 | 显示全部楼层
二、数组+字典法
這字典只要記憶行號即可!!
而不要揹負每行的數據~~記憶門號, 而不是揹著房子走!!!
因為Arr還在, 引用它即可
Brr定義與Arr同樣大小
用列數迴圈, 逐一將Arr元素轉至Brr,
即可避免使用 Application.Index 函數

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-7 17:33 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
准提部林 发表于 2023-10-7 12:50
二、数组+字典法
這字典只要記憶行號即可!!
而不要揹負每行的數據~~記憶門號, 而不是揹著房子走!!!

这个我清楚,这里是为了比较,为了证明VBA中引用工作表函数的效率。
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2023-10-7 18:25 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-7 18:39 | 显示全部楼层
最帅的哥 发表于 2023-10-7 18:25
简单1句的事情,为啥要写那么多?那么多也不怕出错吗?构思、编写不需要时间吗?这哪里有效率、质量可言? ...

我是小白,很多不懂得,麻烦前辈指教一下。

TA的精华主题

TA的得分主题

发表于 2023-10-8 21:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
定义一个数组brr,把这个“Temp = Arr(r, j): Arr(r, j) = Arr(i, j): Arr(i, j) = Temp”,改成这个“brr(i, j) = Arr(r, j): Arr(r, j) = Arr(i, j)”,这样只交换两次,应该比交换三次还快些,你可以试试
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 20:47 , Processed in 0.046658 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表