Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 爱疯

[已解决]对字典基本用法的提速

[复制链接]
 楼主| 发表于 2014-1-14 15:12 | 显示全部楼层
xdwy81129 发表于 2014-1-14 13:15
测试了下,改用  If d(B(i, 1)) + 1 = 1 Then  来判断,结果是24秒
楼主原来的是19.3秒

谢谢xdwy!
我没理解你的修改,不知完整代码是怎样的?
我觉得如果不大改,速度效果不明显。


名称:Intel(R) Pentium(R) CPU G2020 @ 2.90GHz
主频:2900Hz

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2014-1-14 15:42 | 显示全部楼层
excel里用vba的话也就这样的速度了,如果你真想再提速,可以用vb封装成dll,速度会有所提升,或者考虑用vb.net的多线程。。。。。。

评分

参与人数 1 +3 金币 +3 收起 理由
爱疯 + 3 + 3 学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-1-14 15:48 | 显示全部楼层
amesman 发表于 2014-1-14 15:42
excel里用vba的话也就这样的速度了,如果你真想再提速,可以用vb封装成dll,速度会有所提升,或者考虑用vb. ...

谢谢amesman

我现在只是顺便打听一下。
等适当时候,再了解你说的这些高级东东
回复

使用道具 举报

发表于 2014-1-15 13:56 | 显示全部楼层
爱疯 发表于 2014-1-14 15:12
谢谢xdwy!
我没理解你的修改,不知完整代码是怎样的?
我觉得如果不大改,速度效果不明显。



  •     For i = 1 To UBound(A) '表1情况
            d(A(i, 1)) = 1
        Next

        For i = 1 To r
            If d(B(i, 1)) + 1 = 1 Then B(i, 1) = "无" Else B(i, 1) = "有"
        Next i




    英特尔(Intel)奔腾双核G2020 盒装CPU(LGA1155/2.9GHz/3M三级缓存/55w/22,这是你的cpu ,我查的,因为我也很关心计算速度,才狠心买的i5-3570,   3.4GHz的主频

    结果和你的速度基本一样,真不知道为什么我的这个cpu计算不快了



回复

使用道具 举报

发表于 2014-1-16 22:41 | 显示全部楼层
下午闲着没事,把你的代码用三种方法测试了一遍,我的电脑配置比较低
1. vba 法(楼主的代码没改动):我的电脑耗时30秒(楼主只用了20秒,可以看出我的电脑真的是out了);
2. vb封装楼主的代码为dll文件,然后在excel调用,耗时约27秒(提速不明显);
3. VSTO法(vs2010之vb.net),代码适当改动,主要是为了适应vb.net的语法,代码逻辑及思路未变,耗时11秒(提速是相当的明显);
另:尝试了一下多线程(创建了两个),耗时约8秒(略有提速)。
如果换成楼主的电脑,以上费时应当会有所缩短

评分

参与人数 2 +28 金币 +10 收起 理由
xdwy81129 + 18 很给力!
爱疯 + 10 + 10 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-1-16 23:41 | 显示全部楼层
amesman 发表于 2014-1-16 22:41
下午闲着没事,把你的代码用三种方法测试了一遍,我的电脑配置比较低
1. vba 法(楼主的代码没改动): ...

谢谢!
虽然自己不懂,但像看到目标,在遥远的地方。。。。{:021:}
回复

使用道具 举报

发表于 2014-1-17 01:00 | 显示全部楼层
amesman 发表于 2014-1-16 22:41
下午闲着没事,把你的代码用三种方法测试了一遍,我的电脑配置比较低
1. vba 法(楼主的代码没改动): ...

另:尝试了一下多线程(创建了两个),耗时约8秒(略有提速)


求教下,这句话怎么理解及怎么操作,谢谢你,不知道创建2个什么?感谢赐教
回复

使用道具 举报

发表于 2014-1-17 15:33 | 显示全部楼层
xdwy81129 发表于 2014-1-17 01:00
另:尝试了一下多线程(创建了两个),耗时约8秒(略有提速)

这位老兄深夜1点发贴,敬佩中。。。
是这样的,楼主的代码限速步骤其实是在匹配数组B的循环上(我分步测试下,其占时约为整个步骤的2/3),因此,多线程的操作就是把B数组进行拆分成两个数组,中间切,由此形成两个sub,每个sub一个线程,而字典的统计则为公共步骤。
昨天的测试有些匆忙,今天优化了下,多线程耗时约为2秒(不超过3秒),由此观之,若拆分的数组越多,即线程越多,则耗时会更少(再加上楼主高配的电脑。。。。。。{:101:})。以下是部分代码,有兴趣的朋友可以去测试下:
注:定义一个pubic的字典
  1. '拆分的两个sub
  2. Sub Pp1()
  3. Dim B As Array, i As Long, iRow As Long, MidRow As Long
  4. iRow = Globals.Sheet2.Range("A" & Globals.Sheet2.Rows.Count).End(3).Row
  5. MidRow = Int(iRow / 2)
  6. B = Globals.Sheet2.Range("a1:a" & MidRow).Value

  7. For i = 1 To UBound(B)
  8. If d.ContainsKey(B(i, 1)) Then B(i, 1) = "有" Else B(i, 1) = "无"
  9. Next i
  10. Globals.Sheet2.Range("b1:b" & MidRow).Value = B
  11. End Sub

  12. Sub Pp2()
  13. Dim B As Array, i As Long, iRow As Long, MidRow As Long
  14. iRow = Globals.Sheet2.Range("A" & Globals.Sheet2.Rows.Count).End(3).Row
  15. MidRow = Int(iRow / 2)
  16. B = Globals.Sheet2.Range("a" & MidRow + 1 & ":a" & iRow).Value

  17. For i = 1 To UBound(B)
  18. If d.ContainsKey(B(i, 1)) Then B(i, 1) = "有" Else B(i, 1) = "无"
  19. Next i
  20. Globals.Sheet2.Range("b" & MidRow + 1 & ":b" & iRow).Value = B
  21. End Sub
  22. '以下是按键部分代码:
  23. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  24. Dim Start, Finish, TotalTime As Double
  25. Start = Microsoft.VisualBasic.DateAndTime.Timer
  26. Dim A As Array, i As Long

  27. Me.Application.ScreenUpdating = False
  28. A = Globals.Sheet1.Range("a1").CurrentRegion.Value

  29. For i = 1 To UBound(A)
  30. d(A(i, 1)) = ""
  31. Next i

  32. Dim t1 As Threading.Thread
  33. Dim t2 As Threading.Thread
  34. t1 = New Threading.Thread(AddressOf Me.Pp1)
  35. t2 = New Threading.Thread(AddressOf Me.Pp2)

  36. t1.Start()
  37. t2.Start()

  38. Finish = DateTime.Now.ToOADate()
  39. TotalTime = Microsoft.VisualBasic.DateAndTime.Timer - Start
  40. MsgBox("耗时: " & Format(TotalTime, "0.00") & " 秒!")
  41. Me.Application.ScreenUpdating = True
  42. End Sub
复制代码

评分

参与人数 1 +18 收起 理由
xdwy81129 + 18 很给力!太给力了,要好好学习

查看全部评分

回复

使用道具 举报

发表于 2014-1-17 17:09 | 显示全部楼层
amesman 发表于 2014-1-17 15:33
这位老兄深夜1点发贴,敬佩中。。。
是这样的,楼主的代码限速步骤其实是在匹配数组B的循环上(我分步测 ...

大侠,上个附件吧,我把你的代码放到模块里,出现红色的错误,如图

其中有一个错误是: As Array,这个不知道怎么解决
其他红色的地方还恳请大侠指教


捕获.JPG
回复

使用道具 举报

发表于 2014-1-17 18:11 | 显示全部楼层
xdwy81129 发表于 2014-1-17 17:09
大侠,上个附件吧,我把你的代码放到模块里,出现红色的错误,如图

其中有一个错误是: As Array,这个 ...

老兄,用VSTO开发,不是Vba!

评分

参与人数 1 +18 收起 理由
xdwy81129 + 18 谢谢解惑

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-24 13:27 , Processed in 0.734337 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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