gpt4 book ai didi

performance - 如何优化 vlookup 以获得高搜索次数? (VLOOKUP 的替代方案)

转载 作者:行者123 更新时间:2023-12-02 23:24:20 26 4
gpt4 key购买 nike

我正在寻找 vlookup 的替代方案,在感兴趣的上下文中提高性能。

上下文如下:

  • 我有一个很大的 {key;data} 数据集(约 100'000 条记录)
  • 我想对数据集执行大量 VLOOKUP 操作(典型用途是对整个数据集重新排序)
  • 我的数据集没有重复的键
  • 我仅查找精确匹配(VLOOKUP 的最后一个参数为 FALSE)

解释的模式:

引用表:("sheet1")

        A           B
1
2 key1 data1
3 key2 data2
4 key3 data3
... ... ...
99999 key99998 data99998
100000 key99999 data99999
100001 key100000 data100000
100002

查找表:

        A           B
1
2 key51359 =VLOOKUP(A2;sheet1!$A$2:$B$100001;2;FALSE)
3 key41232 =VLOOKUP(A3;sheet1!$A$2:$B$100001;2;FALSE)
4 key10102 =VLOOKUP(A3;sheet1!$A$2:$B$100001;2;FALSE)
... ... ...
99999 key4153 =VLOOKUP(A99999;sheet1!$A$2:$B$100001;2;FALSE)
100000 key12818 =VLOOKUP(A100000;sheet1!$A$2:$B$100001;2;FALSE)
100001 key35032 =VLOOKUP(A100001;sheet1!$A$2:$B$100001;2;FALSE)
100002

在我的 Core i7 M 620 @2.67 GHz 上,计算时间约为 10 分钟

在这种情况下,是否有 VLOOKUP 的替代方案具有更好的性能?

最佳答案

我考虑了以下替代方案:

  • VLOOKUP 数组公式
  • 匹配/索引
  • VBA(使用字典)

比较的性能是:

  • VLOOKUP 简单公式:约 10 分钟
  • VLOOKUP 数组公式:约 10 分钟(1:1 性能指数)
  • 匹配/索引:约 2 分钟(5:1 性能指数)
  • VBA(使用字典):~6 秒(100:1 性能指数)

使用相同的引用表

1)查找表:(vlookup数组公式版本)

         A          B
1
2 key51359 {=VLOOKUP(A2:A10001;sheet1!$A$2:$B$100001;2;FALSE)}
3 key41232 formula in B2
4 key10102 ... extends to
... ... ...
99999 key4153 ... cell B100001
100000 key12818 ... (select whole range, and press
100001 key35032 ... CTRL+SHIFT+ENTER to make it an array formula)
100002

2)查找表:(匹配+索引版本)

         A           B                                       C
1
2 key51359 =MATCH(A2;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B2)
3 key41232 =MATCH(A3;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B3)
4 key10102 =MATCH(A4;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B4)
... ... ... ...
99999 key4153 =MATCH(A99999;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B99999)
100000 key12818 =MATCH(A100000;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B100000)
100001 key35032 =MATCH(A100001;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B100001)
100002

3)查找表:(vbalookup版本)

       A          B
1
2 key51359 {=vbalookup(A2:A50001;sheet1!$A$2:$B$100001;2)}
3 key41232 formula in B2
4 key10102 ... extends to
... ... ...
50000 key91021 ...
50001 key42 ... cell B50001
50002 key21873 {=vbalookup(A50002:A100001;sheet1!$A$2:$B$100001;2)}
50003 key31415 formula in B50001 extends to
... ... ...
99999 key4153 ... cell B100001
100000 key12818 ... (select whole range, and press
100001 key35032 ... CTRL+SHIFT+ENTER to make it an array formula)
100002

注意:由于某些(外部内部)原因,vbalookup 无法一次返回超过 65536 个数据。所以我不得不将数组公​​式一分为二。

以及相关的 VBA 代码:

Function vbalookup(lookupRange As Range, refRange As Range, dataCol As Long) As Variant
Dim dict As New Scripting.Dictionary
Dim myRow As Range
Dim I As Long, J As Long
Dim vResults() As Variant

' 1. Build a dictionnary
For Each myRow In refRange.Columns(1).Cells
' Append A : B to dictionnary
dict.Add myRow.Value, myRow.Offset(0, dataCol - 1).Value
Next myRow

' 2. Use it over all lookup data
ReDim vResults(1 To lookupRange.Rows.Count, 1 To lookupRange.Columns.Count) As Variant
For I = 1 To lookupRange.Rows.Count
For J = 1 To lookupRange.Columns.Count
If dict.Exists(lookupRange.Cells(I, J).Value) Then
vResults(I, J) = dict(lookupRange.Cells(I, J).Value)
End If
Next J
Next I

vbalookup = vResults
End Function

注意:Scripting.Dictionary 需要引用 Microsoft Scripting Runtime,它必须是手动添加(Excel VBA 窗口中的“工具”->“引用”菜单)

结论:

在这种情况下,使用字典的 VBA 比使用 VLOOKUP 快 100 倍,比使用 MATCH/INDEX 快 20 倍

关于performance - 如何优化 vlookup 以获得高搜索次数? (VLOOKUP 的替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18656808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com