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

问题描述 投票:5回答:1

在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

在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])

在可以使用的情况下,这是一个很好的变通方法。但是,在无法做到的情况下,问题仍然存在。

python excel performance xlwings
1个回答
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

PyXll在实现加速方面可能也很有用。

FlyingKoala做的事情与PyXll类似,而且是开源的。https:/github.combradbaseflyingkoala

© www.soinside.com 2019 - 2024. All rights reserved.