Python+Pickle/Parquet/HDF5...不同文件格式存储模式下的量化因子计算性能对比

news2024/11/26 17:47:32

在量化交易中,基于金融市场 L1/L2 报价和交易高频数据进行高频因子计算是一项常见的投研需求。随着金融市场数据量的不断增加,传统的关系数据库已经难以满足大规模数据的存储和查询需求。为了应对这一挑战,一部分用户选择了分布式文件系统,并使用 Pickle、Feather、Npz、Hdf5、以及 Parquet 等格式来存储数据,并结合 Python 进行量化金融计算。

虽然这些存储方案可以支持海量的高频数据,但也存在一些问题,例如数据权限管理困难、不同数据关联不便、检索和查询不便,以及需要通过数据冗余来提高性能等。此外,通过 Python 来读取计算,也需要耗费一些时间在数据传输上。

为解决这些问题,越来越多的券商和私募机构开始采用 DolphinDB 作为分析型的分布式时序数据库。DolphinDB 提供高效的数据存储和计算能力,使得高频数据的因子计算变得更加便捷和高效。

本文旨在对比 DolphinDB 一体化因子计算方案与 Python + 各类文件存储的性能差异。通过本文的对比,读者可以了解 DolphinDB 一体化因子计算的优势,并在实际应用中合理做出选择。

测试基础环境

软硬件信息

本次测试对比了通过 Python + 文件存储 和 DolphinDB 实现的因子计算。其中:

  • Python + 文件存储因子计算方案依赖 Numpy, Pandas, DolphinDB, Multiprocessing 等库。
  • DolphinDB 一体化因子计算方案以 DolphinDB Server 作为计算平台,本次测试使用了单节点部署方式 。

测试所需硬件、软件环境信息如下:

  • 硬件环境
硬件名称配置信息
CPUIntel(R) Xeon(R) Silver 4216 CPU @ 2.10GHz
内存128G
硬盘SSD 500G
  • 软件环境
软件名称版本信息
操作系统CentOS Linux release 7.9.2009 (Core)
DolphinDBV 2.00.9.8
PythonV 3.7.6
NumpyV 1.20.2
PandasV 1.3.5

测试数据

Level 2 行情数据是目前国内证券市场上最为完整,颗粒度最为精细的交易信息数据。其涵盖了在沪深两市上市的股票、可交易型基金、沪深交易所指数等投资标的。

本次测试选取了全市场 2021.02.01 这一个交易日的全部 Level2 历史行情快照数据,该数据包含 26632 支标的,总数据量约为 3100 万条。初始数据存于 DolphinDB 中,Pickle、Parquet 等格式的数据文件均可从 DolphinDB 中导出生成。

快照表测试数据在 DolphinDB 中共55个字段,部分字段展示如下:

字段名数据类型
1SecurityIDSYMBOL
2DateTimeTIMESTAMP
3BidPriceDOUBLE
4BidOrderQtyINT
5…………

部分数据示例如下:

SecurityIDDateTimeBidPriceBidOrderQty
0001552021.12.01T09:41:00.000[29.3000,29.2900,29.2800,29.2700,29.2600,29.2500,29.2400,29.2300,29.2200,29.2100][3700,11000,1400,1700,300,600,3800,200,600,1700]
0006882021.12.01T09:40:39.000[13.5300,13.5100,13.5000,13.4800,13.4700,13.4500,13.4400,13.4200,13.4000,13.3800][500,1200,102200,5500,700,47000,1000,6500,18400,1000]

测试场景

本次测试使用的数据是全市场 2021.12.01 这一个交易日的全部 Level2 历史行情快照数据,其中 Pickle,Parquet,Feather,Hdf5 四种格式的数据都按标的代码分组存储,而 Npz 格式的数据是将所有数据均匀分成十二组后进行存储。以上的这些存储方式都是为了达到计算性能的最优,而暂不考虑存储性能。在实践过程中,可以自己选择不同的存储方式,如 HDFStore( ) 函数可将多个 dataframe 存储为一个 hdf5 文件,压缩比的表现较好,然而并发读写的效率会有所下降。

因子计算与代码实现

本小节主要分为三个部分:高频因子(十档买卖委托均价线性回归斜率、十档净委买增额)介绍、在DolphinDB 中因子实现和 Python 中因子实现。

高频因子

  • 十档买卖委托均价线性回归斜率

十档买卖委托均价即为十档买卖委托额之和除以十档买卖委托量之和:

十档买卖委托均价线性回归斜率为十档买卖委托均价对时间 t 的线性回归的斜率。

  • 十档净委买增额

十档净委买增额因子指的是在有效十档范围内买方资金总体增加量,即所有买价变化量的总和:

有效十档范围内表示不考虑已不在十档范围内的档位,即表示只考虑以下区间的档位:

DolphinDB 中因子实现

  • 十档买卖委托均价线性回归斜率

十档买卖委托均价线性回归斜率的计算需要的参数分别为 OfferOrderQty、BidOrderQty、OfferPrice、BidPrice 四个字段,均为数组向量数据类型,分别为买卖十档价格和十档委托数量。使用 rowSum 这一内建聚合函数提高了因子的计算效率。通过 linearTimeTrend 函数获取因子值对时间 t 的滑动线性回归斜率,该函数返回线性回归的截距和斜率。price.ffill().linearTimeTrend(lag1-1).at(1).nullFill(0).mavg(lag2, 1).nullFill(0) 表示获取十档买卖委托均价对时间t的线性回归的斜率。

@state
def level10_InferPriceTrend(bid, ask, bidQty, askQty, lag1=60, lag2=20){
	inferPrice = (rowSum(bid*bidQty)+rowSum(ask*askQty))\(rowSum(bidQty)+rowSum(askQty))
	price = iif(bid[0] <=0 or ask[0]<=0, NULL, inferPrice)
	return price.ffill().linearTimeTrend(lag1-1).at(1).nullFill(0).mavg(lag2, 1).nullFill(0)
}
  • 十档净委买增额

十档净委买增额的计算需要的参数分别为 BidOrderQty、BidPrice 两个字段,均为数组向量数据类型。首先通过行对齐函数 rowAlign 实现当前十档价格和前一个十档价格进行行对齐,然后通过 rowAt 和 nullFill 函数分别获取对应档位的委托量和实现价格进行对齐,最后计算总的变化额。

@state
def level10_Diff(price, qty, buy, lag=20){
        prevPrice = price.prev()
        left, right = rowAlign(price, prevPrice, how=iif(buy, "bid", "ask"))
        qtyDiff = (qty.rowAt(left).nullFill(0) - qty.prev().rowAt(right).nullFill(0)) 
        amtDiff = rowSum(nullFill(price.rowAt(left), prevPrice.rowAt(right)) * qtyDiff)
        return msum(amtDiff, lag, 1).nullFill(0)
}

Python 中因子实现

  • 十档买卖委托均价线性回归斜率
def level10_InferPriceTrend(df, lag1=60, lag2=20):
    '''
    十档买卖委托均价线性回归斜率
    :param df:
    :param lag1:
    :param lag2:
    :return:
    '''
    temp = df[["SecurityID","DateTime"]]
    temp["amount"] = 0.
    temp["qty"] = 0.
    for i in range(10):
        temp[f"bidAmt{i+1}"] = df[f"BidPrice{i+1}"].fillna(0.) * df[f"BidOrderQty{i+1}"].fillna(0.)
        temp[f"askAmt{i+1}"] = df[f"OfferPrice{i+1}"].fillna(0.) * df[f"OfferOrderQty{i+1}"].fillna(0.)
        temp["amount"] += temp[f"bidAmt{i+1}"] + temp[f"askAmt{i+1}"]
        temp["qty"] += df[f"BidOrderQty{i+1}"].fillna(0.) + df[f"OfferOrderQty{i+1}"].fillna(0.)
    temp["inferprice"] = temp["amount"] / temp["qty"]
    temp.loc[(temp.bidAmt1 <= 0) | (temp.askAmt1 <= 0), "inferprice"] = np.nan
    temp["inferprice"] = temp["inferprice"].fillna(method='ffill').fillna(0.)

    def f(x):
        n = len(x)
        x = np.array(x)
        y = np.array([i for i in range(1, n+1)])
        return (n*sum(x*y) - sum(x)*sum(y)) / (n*sum(y*y) - sum(y)*sum(y))

    temp["inferprice"] = temp.groupby("SecurityID")["inferprice"].apply(lambda x: x.rolling(lag1 - 1, 1).apply(f))
    temp["inferprice"] = temp["inferprice"].fillna(0)
    temp["inferprice"] = temp.groupby("SecurityID")["inferprice"].apply(lambda x: x.rolling(lag2, 1).mean())
    return temp[["SecurityID","DateTime", "inferprice"]].fillna(0)
  • 十档净委买增额
def level10_Diff(df, lag=20):
    '''
    十档委买增额
    :param df:
    :param lag:
    :return:
    '''
    temp = df[["SecurityID","DateTime"]]

    for i in range(10):
        temp[f"bid{i+1}"] = df[f"BidPrice{i+1}"].fillna(0)
        temp[f"bidAmt{i+1}"] = df[f"BidOrderQty{i+1}"].fillna(0) * df[f"BidPrice{i+1}"].fillna(0)
        temp[f"prevbid{i+1}"] = temp[f"bid{i+1}"].shift(1).fillna(0)
        temp[f"prevbidAmt{i+1}"] = temp[f"bidAmt{i+1}"].shift(1).fillna(0)

    temp["bidMin"] = temp[[f"bid{i+1}" for i in range(10)]].min(axis=1)
    temp["bidMax"] = temp[[f"bid{i+1}" for i in range(10)]].max(axis=1)
    temp["prevbidMin"] = temp[[f"prevbid{i+1}" for i in range(10)]].min(axis=1)
    temp["prevbidMax"] = temp[[f"prevbid{i+1}" for i in range(10)]].max(axis=1)
    temp["pmin"] = temp[["bidMin", "prevbidMin"]].max(axis=1)
    temp["pmax"] = temp[["bidMax", "prevbidMax"]].max(axis=1)

    temp["amtDiff"] = 0.0
    for i in range(10):
        temp["amtDiff"] += temp[f"bidAmt{i+1}"]*((temp[f"bid{i+1}"] >= temp["pmin"])&(temp[f"bid{i+1}"] <= temp["pmax"])).astype(int) - \
                        temp[f"prevbidAmt{i+1}"]*((temp[f"prevbid{i+1}"] >= temp["pmin"])&(temp[f"prevbid{i+1}"] <= temp["pmax"])).astype(int)
    temp["amtDiff"] = temp.groupby("SecurityID")["amtDiff"].apply(lambda x: x.rolling(lag, 1).sum())
    return temp[["SecurityID","DateTime", "amtDiff"]].fillna(0)

计算结果对比

计算性能对比

Level 2 行情快照数据一天的数据量超过 10 G,因此金融量化工程师们非常关注 Level 2 行情快照数据的高频因子计算性能。基于前述内容,本节我们从(1)不同并行度(2)不同的文件存储形式两个角度进行 “十档买卖委托均价线性回归斜率” 和 “十档净委买增额” 因子计算的性能对比。计算数据为 26632 支标的,1 天共计3100 万行。我们调节不同的并行度,测试在使用不同 CPU 核数的情况下,每种存储方式计算因子的耗时,并与 DolphinDB 的库内一体化计算耗时比较。所有测试均在清除操作系统缓存后进行。测试结果如下列各表:

  • 表一 16 核心计算性能比较
存储方式\因子十档买卖委托均价线性回归斜率(s)/性能提升(倍数)十档净委买增额(s)/性能提升(倍数)
DolphinDB2.42.3
Python+pickle254.3/104.8105.9/45.4
Python+parquet309.4/127.5147.9/63.4
Python+feather291.1/120.0130.6/56.0
Python+Hdf5281.4/116.0132.0/56.6
Python+Npz346.7/142.9175.2/75.1
  • 表二 8 核心计算性能比较
存储方式\因子十档买卖委托均价线性回归斜率(s)/性能提升(倍数)十档净委买增额(s)/性能提升(倍数)
DolphinDB4.54.4
Python+pickle489.3/102.8231.6/60.0
Python+parquet638.7/143.0296.3/67.9
Python+feather594.2/133.1261.9/60.0
Python+Hdf5563.4/126.2294.6/67.5
Python+Npz648.7/145.3334.3/76.6
  • 表三 4 核心计算性能比较
存储方式\因子十档买卖委托均价线性回归斜率(s)/性能提升(倍数)十档净委买增额(s)/性能提升(倍数)
DolphinDB6.56.8
Python+pickle1014.9/155.6363.9/53.6
Python+parquet1134.9/174.0560.9/82.6
Python+feather1040.6/159.6479.7/70.7
Python+Hdf51021.2/156.6437.4/64.4
Python+Npz1260.3/193.2638.8/94.1
  • 表四 1 核心计算性能比较
存储方式\因子十档买卖委托均价线性回归斜率(s)/性能提升(倍数)十档净委买增额(s)/性能提升(倍数)
DolphinDB21.822.0
Python+pickle3638.2/166.51461.8/66.3
Python+parquet4450.4/203.71759.3/79.8
Python+feather3994.0/182.81773.7/80.5
Python+Hdf53996.9/182.91774.5/80.5
Python+Npz5031.4/230.32437.3/110.6

从比对结果可以看到,本次测试中,在不同 CPU 核数和不同文件存储形式维度下,对于十档买卖委托均价线性回归斜率,DolphinDB 一体化计算比 Python+ 各类存储文件最高可达近200倍提升,平均约100倍左右的提升。考虑两种计算方式的特点,原因大概如下:

  • DolphinDB 自有的数据存储系统的读取效率远优于 Python 读取使用通用存储方式的各类文件存储。
  • DolphinDB 具有 rowSum LinearTimeTrend  等内置函数,在计算因子时避免了繁冗的 for 循环计算方式,从而节省了大量的计算耗时。

尽管 Pickle,Parquet 等格式的数据文件读取可以从技术层面进行针对性冗余存储或者其他针对性优化,但同时会带来额外硬件资源成本、数据使用和管理成本等。相比之下,DolphinDB 自有数据存储系统在使用上更为高效、方便和简单。 因此 DolphinDB 库内一体化因子计算在完整的因子数据读取、计算全过程上的计算速度是远优于 Python + 各类文件存储的因子计算方式。

从计算性能的对比中,不难发现以下现象:

  • 代码实现方面,DolphinDB 的库内 SQL计算更易于实现因子计算调用及并行调用。
  • 并行计算方面,DolphinDB 可以自动使用当前可用的 CPU 资源,而Python 脚本需要通过并行调度代码实现,但更易于控制并发度。
  • 计算速度方面,DolphinDB 的库内计算比 Python + 各类文件存储 的计算方式快 50 至 200 倍之间。

计算准确性对比

上一节中,我们比对了不同计算方式的计算性能。DolphinDB 的库内因子计算在计算速度上要远优于 Python + 各类文件存储的因子计算方式。但是计算快的前提是计算结果要正确一致。本文将 Python +各类文件存储 和 DolphinDB 因子计算结果分别导入为 pandas 中 Dataframe 进行对比。以Python + Pickle 为例,计算结果比对展示如下图,显示的全部结果完全一致。

from pandas.testing import assert_frame_equal
df_ddb = df_dolphindb.sort_values(by=["SecurityID","DateTime","amtDiff"]).reset_index(drop=True)
df_py = res_combined.sort_values(by=["SecurityID","DateTime","amtDiff"]).reset_index(drop=True)
df_ddb = df_ddb.round(4)
df_py = df_py.round(4)
assert_frame_equal(df_ddb, df_py, check_exact=False, rtol=1, atol=1e-06)
print(assert_frame_equal)
"""
对于assert_frame_equal函数,对比结果一致时不输出任何结果,不一致时返回报错信息
"""

常见问题解答

如何复现本文的代码?

根据如下步骤部署项目:

  • 第一步 DolphinDB 部署

首先我们需要下载 DolphinDB 并完成单节点 server 部署搭建,这一步骤在 Linux 系统和 Windows 系统中均可以完成,详细细节可以参考下面的链接:

单节点部署与升级 (dolphindb.cn)

  • 第二步 DolphinDB 客户端安装

安装并启动 GUI 或者 vsCode,连接到 server 后即可复现 DolphinDB 脚本,详细细节参考下面的链接:

使用DolphinDB数据库及客户端

DolphinDB VS Code 插件

  • 第三步 运行 DolphinDB 代码和 Python 代码
    • 执行截图中的代码生成模拟数据

  • 执行截图中的文件 DolphinDB 中的数据导出为 csv 格式文件

服务器对应目录下可以查到对应 csv 文件

  • 在 Python 中运行每个文件将导出的 csv 格式数据转换为对应类型的数据保存到指定路径(以Pickle为例)

结果如下:

  • 在 DolphinDB 中计算因子

  • 在 Python 中计算相应存储方式的因子(以pickle为例)

总结

本篇文章的比较结果显示,在使用相同核数 CPU 前提下,DolphinDB 库内一体化计算性能约为使用Python计算因子的方案的 50 至 200 倍左右,计算结果和 Python 方式完全一样。

  • 在数据的管理和读取方面:
    • DolphinDB 是一个专门为大数据分析和处理设计的分布式数据系统,它使用了一种高效的列式存储格式来优化 I/O 操作。因此,DolphinDB 在大数据集的读取和写入方面具有非常高的性能,而 Python Pandas 库虽然也能处理大型数据集,但在处理极大规模数据时可能面临性能挑战。
    • DolphinDB 内存管理非常高效,可以处理超过内存大小的数据集,而且在内存使用上非常节省。这使得在处理大型数据集时,DolphinDB 可以提供更稳定和更高的性能。而在 Python 中,处理大型数据集时可能需要更多的内存管理和优化工作。
    • DolphinDB 作为一个底层数据库产品,集成丰富API接口、拥有完善版本兼容特性以及权限管控功能,而文件存储在跨平台使用困难、前后版本兼容性差以及缺失权限管控功能,DolphinDB 在运维方面大大优于文件存储方式。
  • 在代码实现方面,DolphinDB 的库内 SQL 计算更易于实现因子计算调用及并行调用。与此同时,DolphinDB 因为使用了成熟的内置函数极大地提升了因子计算的性能,整体代码量可以缩减到一半及以上。
  • 在并行计算方面,DolphinDB 可以自动使用当前可用的 CPU 资源,而 Python 脚本需要通过并行调度代码实现,但更易于控制并发度。

综合而言,在生产环境中,使用 DolphinDB 进行因子计算和存储远比使用 Python + 各类文件存储形式的计算方式更加高效。

附录

本教程中的对比测试使用了以下测试脚本:

戳链接获取完整脚本:python+文件存储与 DolphinDB 因子计算性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1075664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年中国在线语言教育行业发展趋势分析:预计2026年在线语言教育市场规模有望实现1182.3亿元[图]

在线语言教育是指在信息化时代的背景下&#xff0c;使用电脑、手机、平板等基于网络的工具在任何地方、任何时间都可以对语言进行学习的一种教育方式&#xff0c;包括校内在线语言教育和校外在线语言教育。在线语言教育是对未来教育模式的探索&#xff0c;以数字化为杠杆&#…

03_学习springdoc与微服务结合_简述

文章目录 1 前言2 基本结构3 网关的配置3.1 ✍️ pom.xml 引入依赖3.2 &#x1f33f; application.yml 的配置3.2.1 Gateway 的配置3.2.2 Eureka Client 的配置3.2.3 Springdoc 的配置 3.3 Springdoc 配置类 4 影片服务 backend-film 的配置4.1 ✍️ pom.xml 引入依赖4.2 &…

Go语句与表达式深度解析:全案例手册

目录 语句1. 声明语句1.1 变量声明1.2 常量声明 2. 赋值语句3. 控制流语句3.1 条件语句if语句switch语句 3.2 循环语句for语句 3.3 跳转语句break语句continue语句return语句goto语句 4. 其他语句4.1 defer语句4.2 go语句 实战案例 表达式介绍、详解、举例1. 基础表达式1.1 字面…

在线免费无时长限制录屏工具 - 录猎在线版

需要录屏的小伙伴注意啦&#xff0c;想要长时间录制又不想花钱的&#xff0c;可以看下这款在线版录屏软件 —— 录猎在线版&#xff0c;一个录屏软件所需要的基本功能它都有&#xff0c;设置录制范围、录制的声音来源、摄像头也能录制的。同时它是支持Windows和Mac系统的&#…

Flink session集群运维

1、集群job manager挂了 kubectl describe pod session-deployment-only-84b8d674c7-ckl9w -n flink kubectl get pod -n flink -owide kubectl describe pod session-deployment-only-84b8d674c7-ms758 -n flink 两个job manager都挂了 准备重新部署集群 删除操作(删除fli…

GTX314L国产替代SI314—低功耗14通道电容触摸传感器芯片

Si314是一款具有自动灵敏度校准功能的14通道电容传感器&#xff0c;其工作电压范围为1.8~5.5V。 Si314设置休眠模式来节省功耗&#xff0c;此时&#xff0c;功耗电流为10uA3.3V。 Si314各个感应通道可实现独立使能、校准、灵敏度调节&#xff0c;可以确保可靠性&#xff0c;且具…

Mysql创建新用户控制权限信息

目录 登录 进入mysql数据库 创建新用户及设置密码 设置用户可远程连接登录 刷新权限 限制新用户只能从特定的主机或IP地址访问MySQL服务器 限制用户只对特定数据库的访问权限 限制用户只能访问特定数据库中的特定表 撤销给用户授予的特定权限 查看用户的权限信息 注 …

力扣:129. 求根节点到叶节点数字之和(Python3)

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所…

Android攻城狮学鸿蒙-配置

1、config.json配置 鸿蒙中的config.json应该类似于Android开发中Manifest.xml&#xff0c;可以进行页面的配置。根据顺序&#xff0c;会识别启动应用的时候&#xff0c;要打开哪个界面。 2、 Ability详解&#xff0c;以及与Android的Activity对比。 他人的学习文章连接&…

【运维日常】运维必备的 免费 在线画图工具,真的很好用!

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

外贸客户开发信怎么写?如何撰写营销邮件?

外贸客户开发信模板有哪些&#xff1f;高回复率的开发信技巧&#xff1f; 外贸客户开发信是一项至关重要的工作。这封信通常是你与潜在客户建立联系的第一步&#xff0c;因此必须仔细策划和撰写。蜂邮EDM将介绍如何写一封令人印象深刻的外贸客户开发信&#xff0c;以吸引潜在客…

PHP聊天系统源码 在线聊天系统网站源码 后台自适应PC与移动端

程序前台与后台自适应PC与移动端&#xff0c;支持一对多交流&#xff0c;可以自由创建新的房间与解散创建的房间&#xff0c;集成签到功能&#xff0c;等级功能&#xff0c;房间创建者可以对用户进行禁言、拉黑处理&#xff0c;房间可以由房间创建者自由设置进入密码&#xff0…

如何打造一个网络框架模块对接服务器

一、了解网络框架的基本原理 在开始打造网络框架模块之前&#xff0c;首先需要了解网络框架的基本原理。网络框架是一个软件模块&#xff0c;用于处理网络通信的各种细节&#xff0c;包括数据传输、协议解析、错误处理等。常见的网络框架有HTTP、TCP/IP、WebSocket等。 对啦&…

CSS蒙版效果

CSS蒙版 参考地址 显示效果 想要实现一个CSS蒙版效果达到一下效果 准备的原图如下&#xff1a; 实现起来比较简单&#xff0c;使用到了一个css特性。 mask-image: radial-gradient(white 0%, transparent 70%); mask-repeat: no-repeat; mask-position: center; mask-s…

Android 在自己的项目中接入OpenCV+YOLOv8+NCNN : 实现人像分割

1. 前言 通过前两篇文章 Android 导入ncnn-android-yolov8-seg : 实现人体识别和人像分割 、Android ncnn-android-yolov8-seg源码解析 : 实现人像分割 ,我们已经跑起来了程序,也分析了其源码。 接下来,这篇文章我们来实战一下,抽取出Demo的核心代码,在自己的项目中,使用…

短视频账号矩阵源码saas开发-----

短视频矩阵系统源码开发分享 开发背景&#xff1a; 短视频矩阵系统源码是一款基于PHP语言开发的混剪工具&#xff0c;可以方便地将多个抖音账号的视频素材进行混剪&#xff0c;生成一个新的视频。该工具使用了多线程、协程和异步编程等技术&#xff0c;可以显著提高处理速度&…

Kubernetes革命:云原生时代的应用编排和自动化

文章目录 什么是Kubernetes以及为何它备受欢迎&#xff1f;云原生应用和K8s的关系Kubernetes的核心概念&#xff1a;Pods、Services、ReplicaSets等部署、扩展和管理应用程序的自动化容器编排的演进&#xff1a;Docker到Kubernetes实际用例&#xff1a;企业如何受益于K8s的应用…

美发店微信小程序怎么制作

随着智能手机的普及和移动互联网的发展&#xff0c;越来越多的消费者喜欢通过手机APP或微信小程序来寻找附近的美发店。为了满足消费者的需求&#xff0c;提高品牌知名度和客户满意度&#xff0c;美发店需要制作一款微信小程序&#xff0c;为顾客提供更加便捷、高效、优质的美发…

04训练——基于YOLO V8的自定义数据集训练——在windows环境下使用pycharm做训练-1总体步骤

在上文中,笔者介绍了使用google公司提供的免费GPU资源colab来对大量的自定义数据集进行模型训练。该方法虽然简单好用,但是存在以下几方面的短板问题: 一是需要通过虚拟服务器做为跳板机来访问,总体操作起来非常繁杂。 二是需要将大量的数据上传缓慢,管理和使用非常不友…

力扣第654题 最大二叉树 c++注释版

题目 654. 最大二叉树 中等 相关标签 栈 树 数组 分治 二叉树 单调栈 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地…