Dask:Python高效并行計算利器

Dask:Python高效并行計算利器

Dask是一個開源的Python并行計算庫,旨在擴展Python常用工具(如NumPy、Pandas、Scikit-learn等)的功能,使其能夠處理更大規模的數據集和更復雜的計算任務。它通過動態任務調度和分布式計算,能夠高效處理超出單機內存容量的大數據。
文中內容僅限技術學習與代碼實踐參考,市場存在不確定性,技術分析需謹慎驗證,不構成任何投資建議。適合量化新手建立系統認知,為策略開發打下基礎。

第一章:Dask與Pandas基礎回顧與對比

一、理論部分

(一)Dask與Pandas的關系及區別

Pandas 是用于數據處理和分析的強大工具,尤其擅長處理結構化數據,但它的計算能力受限于單機內存和計算資源。Dask 則是一個并行計算庫,能夠擴展 Pandas 的功能,使我們能夠在多核 CPU 甚至集群上處理大規模數據。Dask 通過創建計算任務的有向無環圖(DAG),智能地管理任務的并行執行,從而提高計算效率。

(二)Dask在處理大規模數據方面的優勢

  • 并行計算 :Dask 能夠將任務分解成多個小任務并在多個核心或節點上并行執行,大大加快計算速度。
  • 可處理超大規模數據 :即使數據量超過內存限制,Dask 也能通過分塊處理的方式進行計算。
  • 與 Pandas 高度兼容 :Dask 的 API 設計與 Pandas 高度相似,使得熟悉 Pandas 的用戶能夠快速上手。

(三)A股市場數據分析對計算框架的需求

A 股市場擁有海量的股票數據,包括日線、分鐘線、基本面數據等。隨著數據量的增長和分析復雜度的提高,傳統的單機計算框架如 Pandas 難以滿足高效數據分析的需求。Dask 能夠很好地應對這些挑戰,提供快速、可擴展的數據分析能力。

二、實戰部分

(一)使用 Tushare 獲取 A 股基礎數據

首先,我們需要安裝 Tushare 和 Dask 庫。在終端中運行以下命令:

pip install tushare "dask[distributed]" bokeh

然后,獲取 Tushare 的 API 接口:

import tushare as ts
import pandas as pd# 設置 Tushare pro 的 token,請替換為你的實際 token
ts.set_token("your_token")
pro = ts.pro_api()# 獲取 A 股股票列表
stock_basic = pro.stock_basic(exchange="",list_status="L",fields="ts_code,symbol,name,area,industry,list_date",
)# 后續章節數據準備# 保存 parquet 文件
stock_basic.to_parquet("./data/stock_basic.parquet")# 讀取 parquet 文件
stock_basic = pd.read_parquet("./data/stock_basic.parquet")
print(stock_basic.head())

(二)Pandas 處理 A 股日線數據的基本操作示例

獲取股票日線數據并進行基本處理:

import pandas as pd# 獲取某只股票的日線數據
df = pro.daily(ts_code="000001.SZ", start_date="20230101", end_date="20231231")# 數據清洗:檢查缺失值
print(df.isnull().sum())# 簡單統計:計算漲跌幅的均值和標準差
print(df["pct_chg"].mean(), df["pct_chg"].std())

(三)將 Pandas 代碼改寫為 Dask 代碼的初步嘗試及對比分析

使用 Dask 處理相同的數據:

import dask.dataframe as dd# 使用 Dask 獲取數據
ddf = dd.from_pandas(df, npartitions=4)# Dask 數據清洗:檢查缺失值
print(ddf.isnull().sum().compute())# Dask 簡單統計:計算漲跌幅的均值和標準差
print(ddf["pct_chg"].mean().compute(), ddf["pct_chg"].std().compute())

對比分析

  • 性能 :對于小規模數據,Pandas 和 Dask 的性能差異不大。但當數據量增大時,Dask 的并行計算優勢會逐漸顯現。
  • 內存使用 :Dask 通過分塊處理數據,能夠更好地管理內存使用,避免因數據過大導致內存不足的問題。
  • 代碼兼容性 :大部分 Pandas 的代碼可以很容易地改寫為 Dask 代碼,只需將 pd 替換為 dd ,并添加 .compute() 來觸發計算。

第二章:Dask Delayed - 實現自定義并行計算

一、理論部分

(一)Dask Delayed的核心原理

Dask Delayed 是 Dask 提供的一個簡單且強大的裝飾器,用于將單個函數的執行標記為延遲計算。通過延遲計算,Dask 可以構建一個計算任務的有向無環圖(DAG),智能地管理任務的并行執行,從而提高計算效率。

(二)如何構建延遲計算圖

使用 @delayed 裝飾器標記函數,Dask 會記錄函數的調用過程,而不是立即執行。通過 dask.compute() 函數觸發整個計算圖的執行。

(三)并行計算在A股數據分析中的應用場景

  • 多只股票數據的并行讀取與處理
  • 復雜技術指標的并行計算
  • 大規模數據的分組統計

二、實戰部分

(一)對A股多只股票的歷史數據進行并行讀取與初步處理

import dask
import dask.dataframe as dd
import pandas as pd@dask.delayed
def fetch_stock_data(ts_code, start_date, end_date):# 獲取單只股票的日線數據df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)return df# 獲取股票列表
stock_list = stock_basic[:10]["ts_code"].tolist()# 構建延遲計算圖
results = []
for stock in stock_list:result = fetch_stock_data(stock, "20230101", "20231231")results.append(result)# 觸發計算
final_results = dask.compute(*results)# 查看結果
for i, df in enumerate(final_results):print(f"股票代碼:{stock_list[i]}")print(df.head())print("\n")# 后續章節數據準備# 按 ts_code 分區寫入
stock_data = pd.concat(final_results)
stock_data = stock_data.sort_values("trade_date")
stock_data.to_parquet("./partitioned_data/", partition_cols="ts_code")# 讀取 parquet 文件
stock_data = pd.read_parquet("./partitioned_data/")
print(stock_data.head())

(二)實現自定義的技術指標計算,并行應用于多只股票

@dask.delayed
def calculate_technical_indicator(df):# 計算移動平均線df["ma5"] = df["close"].rolling(window=5).mean()df["ma10"] = df["close"].rolling(window=10).mean()# 計算相對強弱指數(RSI)delta = df["close"].diff()gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()rs = gain / lossdf["rsi"] = 100 - (100 / (1 + rs))return df# 構建延遲計算圖
processed_results = []
for result in results:processed_result = calculate_technical_indicator(result)processed_results.append(processed_result)# 觸發計算
final_processed_results = dask.compute(*processed_results)# 查看結果
for i, df in enumerate(final_processed_results):print(f"股票代碼:{stock_list[i]}")print(df.tail())print("\n")

(三)對比使用與不使用Delayed的計算性能差異

import time# 不使用 Delayed 的情況
start_time = time.time()normal_results = []
for stock in stock_list:df = pd.read_parquet("partitioned_data",filters=[("ts_code", "=", stock),("trade_date", ">=", "20230101"),("trade_date", "<=", "20231231"),],)normal_results.append(df)end_time = time.time()
print(f"不使用 Delayed 的計算時間:{end_time - start_time}秒")@dask.delayed
def get_stock_data(ts_code, start_date, end_date):# 獲取單只股票的日線數據df = pd.read_parquet("partitioned_data",filters=[("ts_code", "=", ts_code),("trade_date", ">=", start_date),("trade_date", "<=", end_date),],)return df# 構建延遲計算圖
results = []
for stock in stock_list:result = get_stock_data(stock, "20230101", "20231231")results.append(result)# 使用 Delayed 的情況
start_time = time.time()# 重新構建延遲計算圖并觸發計算
final_results = dask.compute(*results)
end_time = time.time()
print(f"使用 Delayed 的計算時間:{end_time - start_time}秒")

第三章:Dask Dataframe - 大規模結構化數據處理

一、理論部分

(一)Dask Dataframe的分塊機制

Dask Dataframe 將數據分為多個塊(partitions),每個塊是一個 Pandas Dataframe。這種分塊機制使得 Dask 能夠處理超過內存限制的大規模數據,通過并行處理每個塊來加速計算。

(二)與Pandas兼容的API設計及擴展

Dask Dataframe 的 API 設計與 Pandas 高度兼容,使得熟悉 Pandas 的用戶能夠快速上手。同時,Dask 還擴展了一些功能,能夠更好地處理大規模數據。

(三)大數據場景下的數據分區與篩選策略

在大數據場景下,合理的數據分區和篩選策略能夠大大提高計算效率。可以通過時間、行業、市值等維度對數據進行分區,并在計算過程中進行有效的篩選。

二、實戰部分

(一)處理大規模A股日線數據,實現數據的清洗與預處理

import dask.dataframe as dd
import pandas as pd# 獲取股票列表
stock_basic = pd.read_parquet("./data/stock_basic.parquet")
stock_list = stock_basic[:10]["ts_code"].tolist()# 構建 Dask Dataframe
ddf = dd.from_delayed([get_stock_data(stock, "20230101", "20231231") for stock in stock_list]
)# 數據清洗:去除缺失值和異常值
ddf = ddf.dropna(subset=["close", "vol"])
ddf = ddf[(ddf["close"] > 0) & (ddf["vol"] > 0)]# 預處理:計算每分鐘成交量加權平均價
ddf["vwap"] = (ddf["close"] * ddf["vol"]).cumsum() / ddf["vol"].cumsum()# 查看結果
print(ddf.head())

(二)基于Dask Dataframe進行復雜的分組統計(如按行業、按市值等分組分析股票走勢)

# 獲取股票行業信息
industry_data = stock_basic[:10][["ts_code", "industry"]]# 合并行業信息到分鐘線數據
ddf = ddf.merge(industry_data, on="ts_code", how="left")# 按行業分組,計算每個行業股票的平均價格走勢
grouped = ddf.groupby("industry")["close"].mean().compute()# 查看結果
print(grouped)

(三)優化Dataframe計算過程中的內存使用與計算效率

# 優化內存使用:轉換數據類型
ddf["close"] = ddf["close"].astype("float32")
ddf["vol"] = ddf["vol"].astype("int32")# 持久化數據到內存,避免重復計算
ddf = ddf.persist()# 計算每個行業的成交量總和
industry_vol_sum = ddf.groupby("industry")["vol"].sum().compute()# 查看結果
print(industry_vol_sum)

第四章:Dask Array - 高維數據的并行計算

一、理論部分

(一)Dask Array的塊狀數據結構

Dask Array 將數據分為多個塊(chunks),每個塊是一個 NumPy 數組。塊這種狀數據結構使得 Dask 能夠處理超過內存限制的大規模數組數據,并通過并行處理每個塊來加速計算。

(二)類似NumPy的API設計及并行計算實現

Dask Array 的 API 設計與 NumPy 高度相似,使得熟悉 NumPy 的用戶能夠快速上手。Dask 通過并行計算和優化任務調度,實現了對大規模數組的高效處理。

(三)在量化分析中的矩陣運算場景應用

在量化分析中,Dask Array 可以用于計算股票的相關性矩陣、進行矩陣分解、執行復雜的因子計算等高維數據運算場景。

二、實戰部分

(一)構建A股股票的相關性矩陣,分析股票間的聯動性

import dask
import dask.array as da
import matplotlib.pyplot as plt# 獲取多只股票的日線收盤價格
@dask.delayed
def get_price_data(ts_code, start_date, end_date):df = pd.read_parquet("partitioned_data",columns=["trade_date", "close"],filters=[("ts_code", "=", ts_code),("trade_date", ">=", start_date),("trade_date", "<=", end_date),],)return df.set_index("trade_date")["close"]# 構建 Dask Dataframe
ddf = [get_price_data(stock, "20230101", "20231231") for stock in stock_list]price_dfs = dask.compute(*ddf)
prices = pd.concat(price_dfs, axis=1, keys=stock_list).ffill().dropna()# 計算收益率并轉換為Dask Array
returns = prices.pct_change().dropna()
dask_returns = da.from_array(returns.values.T, chunks=(10, 1000))  # 分塊處理# 并行計算相關系數矩陣
corr_matrix = da.corrcoef(dask_returns)# 可視化結果
plt.figure(figsize=(10, 8))
plt.imshow(corr_matrix.compute(), cmap="viridis", interpolation="none")
plt.colorbar()
plt.title("Stock Correlation Matrix")
plt.show()

(二)使用 Dask 進行大規模因子計算(如計算多種技術指標的矩陣運算)

from dask.distributed import Client
import dask.dataframe as dd
import numpy as np
import pandas as pd
import talib# 啟動Dask本地集群
client = Client()try:# 示例數據stock_data = pd.read_parquet("partitioned_data")# 創建Dask DataFrame并分區ddf = dd.from_pandas(stock_data[["trade_date", "ts_code", "close"]], npartitions=4)ddf = ddf.set_index("ts_code").repartition(partition_size="25MB")# 定義計算RSI的函數def calculate_rsi(partition, timeperiod=14):# 確保按時間排序partition = partition.sort_values("trade_date")partition["trade_date"] = pd.to_datetime(partition["trade_date"])# 使用TA-Lib計算RSIpartition["RSI"] = talib.RSI(partition["close"].values, timeperiod=timeperiod)return partition# 并行計算RSIresult = ddf.map_partitions(calculate_rsi,meta={"trade_date": "datetime64[ns]", "close": "float64", "RSI": "float64"},)# 執行計算并獲取結果df_result = result.compute()print(df_result.tail(20))
finally:# 關閉Dask客戶端client.close()

(三)對比Dask Array與傳統NumPy在大規模數據計算上的性能表現

import numpy as np
import dask.array as da
import time# 使用 NumPy 計算相關性矩陣
numpy_values = ddf["close"].compute()
start_time = time.time()
numpy_corr_matrix = np.corrcoef(numpy_values)
end_time = time.time()
print(f"NumPy 計算時間:{end_time - start_time}秒")# 使用 Dask Array 計算相關性矩陣
start_time = time.time()
dask_corr_matrix = da.corrcoef(ddf["close"]).compute()
end_time = time.time()
print(f"Dask Array 計算時間:{end_time - start_time}秒")

第五章:Dask分布式計算與集群部署

一、理論部分

(一)Dask分布式架構概述

Dask 分布式架構由客戶端、調度器(Scheduler)和工作節點(Workers)組成。客戶端提交任務,調度器負責任務調度與資源管理,工作節點執行具體計算任務。

(二)Worker節點的任務分配與數據傳輸機制

調度器根據任務依賴關系和數據位置等因素,智能地將任務分配給工作節點。工作節點之間通過網絡進行數據傳輸,確保數據在計算過程中高效流動。

(三)在企業級A股數據分析項目中的部署方案

在企業級項目中,可以根據數據規模和計算需求,部署單機多進程、多機集群等不同形式的 Dask 分布式環境。通過合理配置資源,實現高效的并行計算。

二、實戰部分

(一)搭建本地Dask分布式集群

from dask.distributed import Client, LocalCluster# 搭建本地分布式集群
cluster = LocalCluster(n_workers=4, threads_per_worker=2)
client = Client(cluster)# 查看集群信息
print(client)

(二)將前面章節的實戰案例遷移到分布式環境下運行

# 以第二章的股票數據并行讀取與處理為例
@dask.delayed
def get_stock_data(ts_code, start_date, end_date):# 獲取單只股票的日線數據df = pd.read_parquet("partitioned_data",filters=[("ts_code", "=", ts_code),("trade_date", ">=", start_date),("trade_date", "<=", end_date),],)return df# 獲取股票列表
stock_basic = pd.read_parquet("./data/stock_basic.parquet")
stock_list = stock_basic[:10]["ts_code"].tolist()# 構建延遲計算圖
results = []
for stock in stock_list:result = get_stock_data(stock, "20230101", "20231231")results.append(result)# 在分布式環境下觸發計算
final_results = dask.compute(*results)# 查看結果
for i, df in enumerate(final_results):print(f"股票代碼:{stock_list[i]}")print(df.head())print("\n")

(三)監控集群運行狀態,分析分布式計算的性能瓶頸與優化方向

# 查看任務進度
client.dashboard_link# 分析性能瓶頸
# 通過 Dask 的可視化儀表板,可以查看任務執行時間、數據傳輸情況等信息,從而找出性能瓶頸。
# 常見的優化方向包括增加工作節點數量、調整任務劃分粒度、優化數據傳輸方式等。

第六章:Dask在量化投資策略中的綜合應用

一、理論部分

(一)量化投資策略的典型流程與計算需求

量化投資策略通常包括數據獲取、數據處理、因子計算、策略構建和回測等環節。每個環節都對計算框架提出了不同的需求,如高效的數據處理、大規模并行計算、復雜模型的實現等。

(二)Dask如何支持多因子模型、回測系統等復雜策略開發

Dask通過其強大的并行計算和大規模數據處理能力,能夠高效地支持多因子模型的因子計算、數據整合以及回測系統的快速模擬。它能夠處理海量的歷史數據和實時數據,為復雜策略的開發提供堅實的基礎。

(三)大規模數據下的策略優化與風險控制

在大規模數據環境下,策略優化需要考慮計算效率和資源利用。同時,風險控制也需要通過高效的數據分析和模型監測來實現。Dask能夠幫助在這些方面進行有效的管理和優化。

二、實戰部分

(一)開發基于Dask的多因子選股模型,處理海量基本面與技術面數據

import dask.dataframe as dd
from dask.distributed import Client# 搭建本地分布式集群
cluster = LocalCluster(n_workers=4, threads_per_worker=2)
client = Client(cluster)# 獲取技術面數據
technical_data = dd.from_delayed([get_stock_data(stock, "20230101", "20231231") for stock in stock_list]
).compute()# 合并基本面與技術面數據
combined_data = dd.merge(stock_basic, technical_data, on="ts_code", how="left")# 計算選股因子,如移動平均線等
combined_data["ma5"] = combined_data["close"].rolling(window=5).mean()
combined_data["ma10"] = combined_data["close"].rolling(window=10).mean()# 篩選符合條件的股票
selected_stocks = combined_data[(combined_data["ma5"] > combined_data["ma10"])]# 查看結果
print(selected_stocks.compute())

(二)實現高效的回測系統,模擬交易并分析策略表現

# 定義回測函數
def backtest(strategy, data):# 初始化賬戶資金和持倉capital = 1000000positions = {}# 遍歷數據,模擬交易for index, row in data.iterrows():signal = strategy(row)if signal == "buy" and capital > 0:# 買入邏輯shares = capital // row["close"]positions[row["ts_code"]] = sharescapital -= shares * row["close"]elif signal == "sell" and row["ts_code"] in positions:# 賣出邏輯capital += positions[row["ts_code"]] * row["close"]del positions[row["ts_code"]]# 計算最終收益final_value = capital + sum(positions.get(ts_code, 0) * data[data["ts_code"] == ts_code]["close"].iloc[-1]for ts_code in positions)return final_value# 定義策略函數
def simple_strategy(row):if row["ma5"] > row["ma10"]:return "buy"elif row["ma5"] < row["ma10"]:return "sell"else:return "hold"# 獲取回測數據
backtest_data = selected_stocks.compute()
backtest_data = backtest_data.sort_values("trade_date")# 執行回測
result = backtest(simple_strategy, backtest_data)
print(f"策略最終收益:{result}元")

(三)對策略進行壓力測試與參數優化,提升穩健性

# 定義參數優化函數
def optimize_parameters(param_range, strategy, data):best_params = Nonebest_return = -float('inf')for params in param_range:# 設置策略參數# 執行回測return_value = backtest(strategy, data)# 更新最佳參數if return_value > best_return:best_return = return_valuebest_params = paramsreturn best_params, best_return# 定義參數范圍
param_range = [(5, 10), (10, 20), (20, 40)]  # 不同的均線窗口組合# 執行參數優化
best_params, best_return = optimize_parameters(param_range, simple_strategy, backtest_data)
print(f"最佳參數:{best_params}, 最佳收益:{best_return}元")

風險提示與免責聲明
本文內容基于公開信息研究整理,不構成任何形式的投資建議。歷史表現不應作為未來收益保證,市場存在不可預見的波動風險。投資者需結合自身財務狀況及風險承受能力獨立決策,并自行承擔交易結果。作者及發布方不對任何依據本文操作導致的損失承擔法律責任。市場有風險,投資須謹慎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897838.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

掌握市場先機:9款銷售渠道管理工具深度測評

本文主要介紹了以下9款銷售渠道管理工具&#xff1a;1.紛享銷客&#xff1b; 2.銷幫幫&#xff1b; 3.小滿CRM&#xff1b; 4.有贊&#xff1b; 5.Oracle NetSuite&#xff1b; 6.Salesforce Sales Cloud&#xff1b; 7.Cin7&#xff1b; 8.Pipedrive&#xff1b; 9.BigCommerc…

C語言基礎知識04

指針 指針概念 指針保存地址&#xff0c;地址是字節的編號 指針類型和保存的地址類型要一直 使用時注意&#xff0c;把地址轉換為&變量的格式來看 int a[3]; a轉為&a[0] 指針的大小 64bit 固定8字節&#xff0c; 32bit 固定4字節 指針…

計算矩陣邊緣元素之和(信息學奧賽一本通-1121)

【題目描述】 輸入一個整數矩陣&#xff0c;計算位于矩陣邊緣的元素之和。所謂矩陣邊緣的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 【輸入】 第一行分別為矩陣的行數m和列數n&#xff08;m<100&#xff0c;n<100&#xff09;&#xff0c…

異常(9)

大家好,今天我們來詳細介紹一下異常拋出的知識,在編寫程序時,如果程序中出現錯誤,此時就需要將錯誤的信息告知給調用者,話不多說,來看. 在java中,可以借助throw關鍵字,拋出一個指定的異常對象,將錯誤對象告知給調用者,具體語法如下&#xff1a; throw new xxx("異常產生…

網絡安全就業形勢

網絡安全是一個日益增長的行業&#xff0c;對于打算進入或轉行進入該領域的人來說&#xff0c;制定一個清晰且系統的職業規劃非常重要。2025年&#xff0c;網絡安全領域將繼續發展并面臨新的挑戰&#xff0c;包括不斷變化的技術、法規要求以及日益復雜的威脅環境。 第一部分&am…

3U VPX 國產化板卡FT6678+V7 690T

板卡1、 采用標準3U VPX架構&#xff0c;板上集成1片深圳國微電子SMQ7V690TFFG1761&#xff08;pin-to-pin兼容Xilinx的XC7VX690T-2FFG1761I&#xff09;FPGA&#xff0c;1片國防科大FT-M6678&#xff08;功能兼容TI的TMS320C6678&#xff09;&#xff0c;對外接口RS422、網口…

【數據結構】-哈夫曼樹以及其應用

哈夫曼樹&#xff08;Huffman Tree&#xff09; 1. 哈夫曼樹的定義 哈夫曼樹&#xff08;Huffman Tree&#xff09;是一種 帶權路徑長度最短的二叉樹&#xff0c;常用于數據壓縮和最優前綴編碼。其目標是使得 帶權路徑長度&#xff08;WPL&#xff09;最小。 在信息論和計算…

Linux 命名管道

文章目錄 &#x1f680; 深入理解命名管道&#xff08;FIFO&#xff09;及其C實現一、命名管道核心特性1.1 &#x1f9e9; 基本概念 二、&#x1f4bb; 代碼實現解析2.1 &#x1f4c1; 公共頭文件&#xff08;common.hpp&#xff09;2.2 &#x1f5a5;? 服務器端&#xff08;s…

sap 內存管理與數據共享方式

SAP內存管理 內存是程序之間為了傳遞數據而使用的共享存儲空間 SAP內存分類&#xff1a;1、SAP內存&#xff0c;2、ABAP內存 這兩種內存都是針對同一登錄用戶實現數據共享。 SAP內存&#xff08;SAP Memory&#xff09;和ABAP內存&#xff08;ABAP Memory&#xff09;&…

數據結構與算法(哈希表——兩個數組的交集)

原題 349. 兩個數組的交集 - 力扣&#xff08;LeetCode&#xff09; 給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,2,1], nums2 […

python筆記2

變量&#xff1a;含義 一個容器&#xff0c;計算機當中的存儲空間。 可以理解為一個用于標識或引用數據的名字或標簽。 作用&#xff1a; 可以通過定義一個變量來給需要使用多次的數據命名&#xff0c;就像一個標簽一樣。下次需要使用這個數據時&#xff0c;只需要通過這個變…

【Linux系統編程】信號

目錄 1、信號1.1、什么是信號1.2、進程對信號的處理1.3、信號的生命周期1.4、信號處理流程1.5、信號的發送 2、kill()、raise()函數 發送信號3、alarm函數 鬧鐘信號4、pause函數 掛起信號、暫停5、singal 函數 捕獲信號5.1、為什么返回值是上一次的處理方式5.2、練習 6、sigact…

實用小工具——快速獲取數據庫時間寫法

最近我遇到了一個比較棘手的問題&#xff1a;在工作中&#xff0c;各個項目所使用的數據庫類型各不相同。這導致我習慣性地使用Oracle的SQL語句進行編寫&#xff0c;但每次完成后都會遇到報錯&#xff0c;最終才意識到項目的數據庫并非Oracle。為了避免這種情況&#xff0c;我需…

數據類型及sizeof,進制轉換

其實數據類型可以講很多內容&#xff0c;這里看情況需要講多久吧。 本篇基本都是理論。 目錄 數據類型的分類 基本數據類型 構造數據類型 指針類型 空類型 計算數據類型或變量所占用的內存字節數 基本語法 進制轉換 二進制 二進制的概念 二進制與十進制的轉換 十六進…

pjsip dtmf發送和接收(pjsua)

DTMF(雙音多頻,Dual-Tone Multi-Frequency)是一種用于電話系統的信號技術,通過組合兩個不同頻率的音頻信號來表示數字和符號。以下是DTMF的主要使用背景和應用場景: 電話撥號 DTMF最常見的用途是電話撥號。當用戶按下電話鍵盤上的數字或符號時,電話會生成兩個特定頻率的音…

落雪音樂Pro 8.8.6 | 內置8條音源,無需手動導入,純凈無廣告

洛雪音樂Pro版內置多組穩定音源接口&#xff0c;省去手動導入的繁瑣操作&#xff0c;安裝即可暢聽海量音樂。延續原版無廣告的純凈體驗&#xff0c;支持歌單推薦與音源切換&#xff0c;滿足個性化聽歌需求。此版本僅支持在線播放&#xff0c;無法下載音樂&#xff0c;且與原版不…

mac安裝navicat及使用

0.刪除舊的 sudo rm -Rf /Applications/Navicat\ Premium.app sudo rm -Rf /private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.playlist sudo rm -Rf ~/Library/Caches/com.apple.helpd/SDMHelpData/Other/English/HelpSDMIndexF…

【Unity】 HTFramework框架(六十二)Agent編輯器通用智能體(AI Agent)

更新日期&#xff1a;2025年3月14日。 Github源碼&#xff1a;[點我獲取源碼] Gitee源碼&#xff1a;[點我獲取源碼] 索引 編輯器通用智能體AIAgent類Friday&#xff08;星期五&#xff09;啟用智能體設置智能體類型開放智能體權限智能體交互資源優化批處理運行代碼聯網搜索休閑…

EverArt MCP 服務器安裝調試筆記 -cline

EverArt MCP 服務器安裝調試筆記 問題描述 用戶在使用 EverArt MCP 服務器時遇到報錯&#xff1a;“MCP error -1: Connection closed”。 調試過程 檢查配置文件 cline_mcp_settings.json: 確認 everart 服務器的配置信息&#xff0c;包括 command、args 和 env 是否正確。…

MFC中使用Create或CreateDialog創建對話框失敗,GetLastError錯誤碼為1813(找不到映像文件中指定的資源類型)

文章目錄 創建對話框失敗示例、原因分析及解決方案示例代碼錯誤原因解決方案 AFX_MANAGE_STATE(AfxGetStaticModuleState())作用一、功能1. 模塊狀態切換2. 自動狀態恢復 二、為什么要用該函數&#xff1f;三、必須使用該宏的典型場景1. MFC 擴展 DLL&#xff08;Extension DLL…