能否在Alteryx Python工具中使用functools装饰器实现函数缓存?
问题
是否可以在Alteryx的Python工具中使用functools(如@cache)这类Python装饰器?我需要实现重复的函数求值,缓存结果将大幅节省时间。
我在Python中见过如下用法示例,但想了解如何在Alteryx的Python环境中实现类似性能:
from functools import lru_cache import numpy as np def estimate_error(x): t = 1 / (1 + 0.33 * abs(x)) pre_erf = (((1.06 * t - 1.45) * t + 1.42) * t - 0.29) * t + 0.25 erf = np.sign(x) * (1 - pre_erf * t * np.exp(- x * x)) return erf @lru_cache(maxsize=1024) def fast_ln_sf(x, scale, shape): return 0.5 - 0.5 * estimate_error(0.7 * (np.log(x) - np.log(scale)) / shape)
该函数将作为我优化问题的目标函数,若变量较多,它至少会被调用数千次。其使用场景如下:
def obj(x, *args): a = args[0].to_numpy() s = args[1].to_numpy() c = args[2].to_numpy() n = args[3] sum_ = 0 for i in range(n): sum_ += (a * fast_ln_sf(x[i], s, c)) return -1 * sum_ solution = scipy.optimize.minimize(obj, args = [df.a, df.b, df.s, df.c, df.shape[0]])
回答
完全可以在Alteryx的Python工具中使用functools里的装饰器,包括@lru_cache或@cache,实现逻辑和标准Python环境一致,只需注意几个关键细节:
- 参数必须可哈希:
lru_cache要求函数参数是可哈希类型(如数值、字符串、元组)。你的示例中fast_ln_sf的x、scale、shape如果是单个数值没问题;如果是numpy数组,需要先转为元组等可哈希类型,否则会触发错误。 - 直接导入使用:Alteryx的Python工具默认包含标准库,无需额外安装依赖,直接写
from functools import lru_cache就能调用。 - 场景针对性优化:你的
obj函数循环调用fast_ln_sf,若s和c是固定不变的数组,可将其移出函数参数,或仅针对变化的x[i]做缓存,避免重复缓存相同s、c的组合。同时尽量用numpy向量化运算替代循环,配合缓存能最大化性能提升。 - 调整缓存大小:根据实际调用次数修改
maxsize,若调用次数远超1024,可设为None(无限制),但要留意内存占用情况。
你提供的代码只需确保DataFrame和参数传递正确,就能在Alteryx中直接运行并获得缓存带来的性能收益。
内容的提问来源于stack exchange,提问作者Aadarsh Gupta
相关产品推荐
相关产品推荐

