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)
当可以使用它时,这是一个很好的解决方法.但是,在无法完成的情况下,问题仍然存在.
使用数组公式是提高性能的最佳方法。最好在适当的情况下利用 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