Python循环比Excel VBA慢?

时间:2015-05-05 06:16:51

标签: python vba excel-vba excel

我在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

2 个答案:

答案 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 的性能进行比较。