如何在Excel中提高xlwings UDF的速度?

时间:2017-05-26 14:00:09

标签: python excel performance xlwings

在Python 3中,我通过UDFs在Excel中使用xlwings来计算公式。公式计算超过4000次,刷新工作表大约需要25秒。以下公式用作示例。使用公式引用单元格=test_1(B20,C20,D20),在每个Excel单元格中的Excel中调用公式。 VBA优化连接设置设置为true OPTIMIZED_CONNECTION = True

@xw.func  
def test_1(x, y, z):  
    a = x**2 + y**2 + z**2  
return a

在VBA或Excel中计算相同的公式几乎是即时的。所以我的问题是为什么它如此缓慢,有没有办法提高速度?

*新信息

使用数组公式要比多次调用UDF快得多。下面的公式与原始公式的作用相同,但是将范围作为输入并返回范围。

@xw.func
@xw.ret(expand='table')
def test_array(x, y, z):
    a = np.array(x)**2 + np.array(y)**2 + np.array(z)**2
    return np.transpose(a[np.newaxis])

这是一个很好的解决方法,可以使用它。但是,如果无法完成,问题仍然存在。

3 个答案:

答案 0 :(得分:1)

使用数组公式是提高性能的最佳方法。最好在适当的情况下利用大熊猫来加快速度。

import xlwings as xw
from pandas import DataFrame
import numpy as np

@xw.func
@xw.arg('T_min', np.array, doc='Daily minimum temperature')
@xw.arg('T_max', np.array, doc='Daily maximum temperature')
@xw.ret(index=False, header=False, expand='down')
def SimpleDegreeDay(T_min, T_max):
    """Function to assemble a dataframe for calculating Degree Day using dynamic arrays.

    :param T_min: Daily minimum temperature
    :param T_max: Daily maximum temperature
    """

    degreeDay = DataFrame({'T_min': T_min, 'T_max': T_max})

    return ((degreeDay['T_min'] + degreeDay['T_max']) / 2) * 10

PyXll可能也有助于实现加速。

FlyingKoala的功能类似于PyXll,并且是开源的。 https://github.com/bradbase/flyingkoala

答案 1 :(得分:0)

您可以使用 xlOil (免责声明:我写过)来执行此操作。它使用C-API进行了严格绑定,因此Excel和Python之间的开销很小。 Python插件的文档位于:https://xloil.readthedocs.io/en/latest/xlOil_Python/index.html,但要运行的摘要如下:

pip install xloil
xloil install

然后在py文件中添加您的功能:

import xloil
@xloil.func
def test_1(x, y, z):  
    a = x**2 + y**2 + z**2  
    return a

您可以将py文件命名为 YourWorkbookName.py ,然后加载关联的工作簿,或直接通过xlOil的 .ini 设置文件加载模块。

我尝试在4000行上运行test_1,结果几乎是瞬间出现的。当作为数组函数调用时,它甚至更快-您无需以任何方式修改函数即可执行此操作,只需调用=test_1(A1:A4124,B1:B4124,C1:C4124),然后将参数作为numpy数组传递。

您为此付出的(较小)价格是Excel和Python必须具有相同的位数,因此您可能需要另外安装python。

答案 2 :(得分:0)

如果要提高性能,请考虑使用xlwings以外的产品。这是xlwings和PyXLL(在Python中嵌入Python的加载项,请参见https://www.pyxll.com)之间的比较的链接。 https://support.pyxll.com/hc/en-gb/articles/360042910613-What-is-the-difference-between-PyXLL-and-xlwings-#h_4d5038b2-2bd8-4911-95a0-05683c1fd532

由于其工作方式,您应该发现PyXLL比xlwings快几个数量级。它在Excel进程本身中运行Python,因此与xlwings相比,与在Python和Excel之间进行调用相比,开销要少得多。它还针对numpy进行了优化,因此在您的用例中应该可以很好地工作。

但是请注意,它不是免费软件。