You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:50:16