gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:16:41 28 4
gpt4 key购买 nike

在 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.com/bradbase/flyingkoala

关于python - 如何提高 Excel 中 xlwings UDF 的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203521/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com