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

J. *_*aay 5 python excel performance xlwings

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

@xw.func  
def test_1(x, y, z):  
    a = x**2 + y**2 + z**2  
return a
Run Code Online (Sandbox Code Playgroud)

在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])
Run Code Online (Sandbox Code Playgroud)

当可以使用它时,这是一个很好的解决方法.但是,在无法完成的情况下,问题仍然存在.

bra*_*ase 1

使用数组公式是提高性能的最佳方法。最好在适当的情况下利用 pandas 以获得良好的加速。

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
Run Code Online (Sandbox Code Playgroud)

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

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