在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])
在可以使用的情况下,这是一个很好的变通方法。但是,在无法做到的情况下,问题仍然存在。
使用数组公式是提高性能的最好方法。而且最好在适当的地方利用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