我在excel(VBA)和python执行简单循环之间进行了一些测试。代码如下。令我惊讶的是,vba明显快于python。快了近6倍。我认为,由于python在命令行中运行,因此性能会更好。你们对此有何评论?
的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)
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
答案 0 :(得分:5)
关于这一点的缓慢部分是print
。打印到控制台非常慢,所以你应该完全避免它。我假设在Excel中设置单元格值的速度要快得多。
如果要比较计算速度,则循环内不应有任何I / O.相反,只计算处理整个循环所花费的时间而不做任何事情(或做一些简单的事情,如添加数字或其他东西)。如果你这样做,你会发现Python非常快。
答案 1 :(得分:0)
它随着您需要执行的计算而变化,并且很难通过简单的比较以简单的方式给出更快的证明。所以我会以一般的方式分享我的经验,没有证据,但对可能产生很大差异的事情发表一些评论。
根据我的经验,如果在纯 python 和纯 VBA 之间比较具有完全相同代码的简单 for 循环,VBA 大约快 3 倍。但是没有人用不同的语言做同样的事情。您必须应用每种语言的最佳做法。
如果您应用 VBA 最佳实践,您可以通过声明变量和其他类似的优化在 python 中不可用来使其更快。根据我的经验,这可以使代码快 2-3 倍。因此,您可以使 VBA 代码比 Python 中的简单 for 循环快 6-9 倍。
另一方面,如果您应用 Python 最佳实践,您通常不会编写常规的 for 循环。您将使用列表推导,或者您将使用 numpy 和 scipy,它们在已编译的 C 库中运行。这些解决方案比 VBA 代码快得多。
一般来说,如果你执行复杂的矩阵计算,你可以用 numpy 和 scipy 来完成,python 会比 VBA 快。在其他情况下,VBA 速度更快。
在 python 中,你也可以使用 Numba,它增加了一些代码的复杂性,但它有助于生成编译代码并处理在 GPU 中运行它。它会让你的代码更快。
这是我在主要涉及内部数组的纯计算方面的经验。我没有将 I/O 与 GUI、外部文件和数据库、网络通信或 API 的性能进行比较。