Jim*_*myn 3 python excel vba excel-vba
我在excel(VBA)和python执行简单循环之间进行了一些测试.代码如下.令我惊讶的是,vba明显快于python.快了近6倍.我认为,由于python在命令行中运行,因此性能会更好.你们对此有何评论?
蟒蛇
import time
import ctypes # An included library with Python install.
start_time = time.time()
for x in range(0, 1000000):
print x
x = ("--- %s seconds ---" % (time.time() - start_time))
ctypes.windll.user32.MessageBoxA(0, x, "Your title", 1)
Run Code Online (Sandbox Code Playgroud)
Excel(VBA)
Sub looptest()
Dim MyTimer As Double
MyTimer = Timer
Dim rng As Range, cell As Range
Set rng = Range("A1:A1000000")
x = 1
For Each cell In rng
cell.Value = x
x = x + 1
Next cell
MsgBox Timer - MyTimer
End Sub
Run Code Online (Sandbox Code Playgroud)
你的两个代码示例没有做同样的事情.在Python代码中,内部循环必须:
range(0, 1000000)
.在VBA代码中,Excel必须:
Range("A1:A1000000")
(与Python范围无关).cell.Value
属性.x
.让我们重写一下,让Python和VBA循环做同样的事情,尽可能接近:
import time
import ctypes
start_time = time.time()
x = 0
while x <= 1000000:
x = x + 1
x = ("--- %s seconds ---" % (time.time() - start_time))
ctypes.windll.user32.MessageBoxA(0, x, "Your title", 1)
Run Code Online (Sandbox Code Playgroud)
Declare Function QueryPerformanceCounter Lib "kernel32" (t As Currency) As Boolean
Declare Function QueryPerformanceFrequency Lib "kernel32" (t As Currency) As Boolean
Sub looptest()
Dim StartTime As Currency
QueryPerformanceCounter StartTime
x = 0
Do While x <= 1000000
x = x + 1
Loop
Dim EndTime As Currency
QueryPerformanceCounter EndTime
Dim Frequency As Currency
QueryPerformanceFrequency Frequency
MsgBox Format$((EndTime - StartTime) / Frequency, "0.000")
End Sub
Run Code Online (Sandbox Code Playgroud)
在我的计算机上,Python需要大约96毫秒,而VBA 33毫秒 - VBA的执行速度要快三倍.如果你在扔Dim x As Long
,它执行6快倍.
为什么?那么,让我们来看看每个如何运行.Python在内部将您的.py
文件编译为a .pyc
,并在Python VM下运行它.另一个答案详细描述了Python案例.Excel将VBA编译为MS P-Code,并在Visual Basic VM下运行它.
此时,python.exe
命令行和Excel是GUI 无关紧要.在虚拟机上运行你的代码,它生活在您的计算机的肠子得更深一些.性能取决于已编译代码中的特定指令,以及VM运行这些指令的效率.在这种情况下,VB VM运行其P-Code的速度比Python VM运行速度快.pyc
.
关于这一点的缓慢部分是print
.打印到控制台非常慢,所以你应该完全避免它.我假设在Excel中设置单元格值的速度要快得多.
如果要比较计算速度,则循环内不应有任何I/O. 相反,只计算处理整个循环所花费的时间而不做任何事情(或做一些简单的事情,如添加数字或其他东西).如果你这样做,你会发现Python非常快.
归档时间: |
|
查看次数: |
4991 次 |
最近记录: |