weixin_42642734 2023-03-20 20:05 采纳率: 50%
浏览 81
已结题

python多进程与np数组与talib计算金融指标问题

cpu24核心笔记本电脑2个内存条16g 3200m x2,用1核运行速度是50+每秒it。用10个应该是500+。但是只有170+,我尝试从1核到10核测试,发现到3核后就不是成倍增加了,后面增加核心速度变快的很少。是不是内存速度瓶颈。

 with Pool(processes=workers) as pool:  #
            # 使用并行批量获得<class 'list'>
            results = pool.imap_unordered(
                # 先测试单个核心一秒多少个,用于设置chunksize参数
                partial(calculate_by_one_loop, duo_lock=duo_lock), para_list, chunksize=50)
            # 显示进度条
            for i, result in tqdm(enumerate(results),
                                  total=total, desc='总任务进度', mininterval=1, maxinterval=1):
                df_list.append(result)

其中calculate_by_one_loop是目标函数,里面就执行np数组的计算

x = talib.SMA(close, timeperiod=10)

@jit('float64[:,:](float64[:], float64[:], float64[:], float64[:])')
def numpy_chaoji_qushi(atr, close, high, low):
    """
    超级趋势计算

    :param atr: 真实波动幅度
    :param close: 收盘
    :param high: 最高
    :param low: 最低
    :return: 超级趋势
    """

    src = np.full_like(close, np.nan, dtype='float64')  # 生成空白的数组,结构和close一样
    up = np.full_like(close, np.nan, dtype='float64')  # 生成空白的数组,结构和close一样

    dn = np.full_like(close, np.nan, dtype='float64')  # 生成空白的数组,结构和close一样

    for i in range(close.shape[0]):
        # 价格源hlc3
        src[i] = (close[i] + high[i] + low[i]) / 3
        # 计算超级趋势指标的上涨趋势线
        up[i] = src[i] - atr[i]
        # 过去的收盘价 大于 up[1]
        if close[i - 1] > up[i - 1]:
            # up就等于 up 与up1 中最大的
            up[i] = max(up[i], up[i - 1])
        else:  # 不是就返回up自己
            up[i] = up[i]
        # 计算超级趋势指标的下跌趋势线
        dn[i] = src[i] + atr[i]
        # 过去的收盘价 大于 up[1]
        if close[i - 1] < dn[i - 1]:
            # up就等于 up 与up1 中最大的
            dn[i] = min(dn[i], dn[i - 1])
        else:  # 不是就返回up自己
            dn[i] = dn[i]

    return np.vstack((up, dn))

很多这种使用talib的代码,基本用5列数组会生成几十上百列。再循环判断逻辑。我测试过单次计算50多ms
之前我是使用pandas的df
例如:df['x'] = talib.SMA(df['close'], timeperiod=10)
后面改成np数组,没使用一点df。速度提升了一点点。我重新写了一个只计算数学问题的程序,速度是随着进程数成倍增加的。我20核全开速度就比1核快将近20倍。所以我怀疑内存速度,但是我不知道怎么优化,已经从df数据改成np数组了。每计算一个金融指标(均线这些)就有一个单独的变量存起来。我看别人用服务器cpu和主板和内存,开几十上百个线程,速度飞快
帮我优化一下

  • 写回答

3条回答 默认 最新

  • 谁在墙外等红杏 企业官方账号 2023-03-21 10:36
    关注

    可能是内存速度瓶颈,也可能是其他因素导致的。在多核并行计算中,除了CPU核心数和内存大小外,还有很多因素会影响计算速度,比如硬盘速度、缓存大小、算法复杂度等等。因此,要想准确分析速度瓶颈,需要对整个系统进行综合评估,包括硬件和软件方面。

    另外,从1核到10核速度增加不是成倍增加,这也是正常现象。多核并行计算的速度增加并不是线性的,随着核心数的增加,计算效率会逐渐降低,因为多核并行计算需要更多的协调和同步,而这些操作也需要消耗一定的时间和资源。

    总之,要想提高多核并行计算的速度,需要从多个方面入手,包括优化算法、提高硬件性能、合理调整系统参数等等。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: