在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])
这是一个很好的解决方法,可以使用它。但是,如果无法完成,问题仍然存在。
答案 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进行了优化,因此在您的用例中应该可以很好地工作。
但是请注意,它不是免费软件。