測(cè)試實(shí)戰(zhàn):基于 ASV 的本地開發(fā)與自動(dòng)化性能監(jiān)控體系)
數(shù)據(jù)分析數(shù)據(jù)可視化大數(shù)據(jù)數(shù)據(jù)科學(xué)【免費(fèi)下載鏈接】vaexOut-of-Core hybrid Apache Arrow/NumPy DataFrame for Python, ML, visualization and exploration of big tabular data at a billion rows per second 項(xiàng)目地址https://gitcode.com/gh_mirrors/va/vaex點(diǎn)擊查看免費(fèi)下載Vaex 作為一個(gè)面向十億行級(jí)表格數(shù)據(jù)、以 Out-of-Core內(nèi)存外計(jì)算為核心的 DataFrame 庫(kù)性能演進(jìn)始終是其開發(fā)重心。為了讓每次提交都能被量化評(píng)估Vaex 將一套完整的基準(zhǔn)測(cè)試benchmark體系集成進(jìn)倉(cāng)庫(kù)以 Airspeed VelocityASV為運(yùn)行引擎在專用硬件上按既定調(diào)度自動(dòng)運(yùn)行并把結(jié)果以 HTML 報(bào)告和歷史 JSON 數(shù)據(jù)的形式持續(xù)沉淀下來(lái)。本文以 benchmarks/README.rst 為主線結(jié)合倉(cāng)庫(kù)內(nèi)真實(shí)的基準(zhǔn)測(cè)試源碼benchmarks/目錄與調(diào)度腳本 bin/benchmark_new_commits.sh完整講解如何在本地開發(fā)/驗(yàn)證基準(zhǔn)測(cè)試、如何讓基準(zhǔn)在專用機(jī)器上自動(dòng)化運(yùn)行以及如何從零搭建一臺(tái)基準(zhǔn)測(cè)試運(yùn)行機(jī)。讀完本文你將掌握 Vaex 性能基準(zhǔn)的編寫規(guī)范、ASV 的兩種本地運(yùn)行模式以及整套自動(dòng)化基準(zhǔn)管線的搭建方法。技術(shù)選型為什么是 Airspeed VelocityVaex 的基準(zhǔn)測(cè)試統(tǒng)一由 ASVAirspeed Velocity驅(qū)動(dòng)。ASV 是一個(gè)面向 Python 項(xiàng)目的性能基準(zhǔn)框架核心優(yōu)勢(shì)包括環(huán)境隔離可以在獨(dú)立 Conda 環(huán)境中針對(duì)不同版本/提交運(yùn)行測(cè)試避免環(huán)境污染導(dǎo)致的結(jié)果失真參數(shù)化矩陣支持params/param_names聲明參數(shù)化測(cè)試自動(dòng)展開成多維測(cè)試矩陣結(jié)果歷史自動(dòng)維護(hù).asv/results/目錄下的 JSON 結(jié)果歷史便于長(zhǎng)期追蹤性能回歸報(bào)告生成通過(guò)asv publish生成靜態(tài) HTML 報(bào)告方便發(fā)布到 Web 供團(tuán)隊(duì)與社區(qū)查看。在 Vaex 倉(cāng)庫(kù)中這一體系被劃分為兩個(gè)層面開發(fā)層面開發(fā)者在本地編寫、調(diào)試、試跑基準(zhǔn)測(cè)試asv dev/asv run --python$(which python)生產(chǎn)層面專用硬件按 cron 調(diào)度自動(dòng)運(yùn)行bin/benchmark_new_commits.sh覆蓋master分支的新提交與bench*分支的增量提交。安裝 ASV按 benchmarks/README.rst 的說(shuō)明ASV 通過(guò) Conda 安裝conda-forge 渠道conda install -c conda-forge asv安裝后在倉(cāng)庫(kù)根目錄下即可使用asv命令。注意本地開發(fā)模式并不要求創(chuàng)建專用 Conda 環(huán)境直接復(fù)用當(dāng)前 Python 環(huán)境即可而生產(chǎn)機(jī)器上 ASV 會(huì)為每次基準(zhǔn)運(yùn)行創(chuàng)建獨(dú)立的新 Conda 環(huán)境詳見下文生產(chǎn)環(huán)境部分。認(rèn)識(shí) benchmarks 目錄基準(zhǔn)測(cè)試的組織方式倉(cāng)庫(kù)中的 benchmarks/ 目錄集中存放所有基準(zhǔn)測(cè)試按功能域拆分為多個(gè)模塊文件文件覆蓋主題aggregates.py聚合操作count、mean、binby 一維/二維分箱、groupbystrings.py字符串操作capitalize、contains、regex、split、replace 等f(wàn)ilter.py過(guò)濾后的 head / tail / countgroupby.pygroupby 聚合groupbyh2o.pyH2O 風(fēng)格的 groupby 基準(zhǔn)hashmap.py哈希表相關(guān)基準(zhǔn)isin.pyisin成員判斷性能sort.py排序性能export.pyHDF5 導(dǎo)出性能bookkeeping.py簿記類操作fixtures.py基準(zhǔn)數(shù)據(jù)集生成工具所有這些模塊通過(guò) benchmarks/init.py 組織為 ASV 可識(shí)別的基準(zhǔn)測(cè)試集合ASV 默認(rèn)遞歸發(fā)現(xiàn)bench_*目錄/文件中滿足命名約定的類與函數(shù)。編寫基準(zhǔn)測(cè)試結(jié)構(gòu)規(guī)范與源碼解析ASV 的基準(zhǔn)測(cè)試通常以類或帶setup屬性的函數(shù)為單位方法名以time_、peak、mem等前綴命名以區(qū)分計(jì)時(shí)/內(nèi)存等指標(biāo)。下面以倉(cāng)庫(kù)真實(shí)代碼為例拆解其結(jié)構(gòu)。類級(jí)元數(shù)據(jù)在 benchmarks/strings.py 中可以看到典型的類元數(shù)據(jù)聲明class Strings: pretty_name Performance of string operations version 1 timeout 3600 # in seconds param_names [ N, # number of rows to use ] params ([10**7])pretty_name基準(zhǔn)的可讀名稱用于在 HTML 報(bào)告中展示version基準(zhǔn)版本號(hào)改動(dòng)基準(zhǔn)邏輯時(shí)遞增ASV 據(jù)此區(qū)分新舊結(jié)果timeout單次運(yùn)行的超時(shí)時(shí)間秒字符串基準(zhǔn)因數(shù)據(jù)量大設(shè)為 3600 秒params/param_names聲明參數(shù)化矩陣。params為列表的列表與param_names一一對(duì)應(yīng)ASV 會(huì)自動(dòng)生成笛卡爾積。例如 aggregates.py 中params ([10**7, 5*10**7, 10**8],)param_names [N]表示在 1 千萬(wàn)、5 千萬(wàn)、1 億行三種規(guī)模下各跑一遍而 isin.py 則同時(shí)參數(shù)化行數(shù) N 與候選值個(gè)數(shù) Mparams ([10**7, 5*10**7, 10**8], (1, 10, 100, 1_000, 1_000_000)) param_names [N, M]數(shù)據(jù)準(zhǔn)備setup_cache 與 setupASV 基準(zhǔn)類中兩個(gè)特殊方法負(fù)責(zé)數(shù)據(jù)準(zhǔn)備setup_cache(self)只運(yùn)行一次負(fù)責(zé)生成昂貴且可復(fù)用的數(shù)據(jù)結(jié)果會(huì)被 ASV 緩存。Vaex 中典型用法是調(diào)用 fixtures.py 中的生成函數(shù)確保測(cè)試數(shù)據(jù)集存在def setup_cache(self): # ensure the dataframe is generated generate_numerical()setup(self, *params)每組參數(shù)組合運(yùn)行前調(diào)用一次每次計(jì)時(shí)前都會(huì)執(zhí)行負(fù)責(zé)加載 DataFrame、切片、預(yù)處理。例如 strings.py 中的 setup 將 1 億行數(shù)據(jù)集切成前 N 行并把執(zhí)行器的 buffer 劃分為 24 個(gè)分區(qū)以貼近多線程執(zhí)行場(chǎng)景def setup(self, N): partitions 24 df vaex.open(generate_strings()) df_vaex df[0:int(N)] df_vaex.executor.buffer_size len(df_vaex) // partitions self.df df_vaex而 aggregates.py 的 setup 還會(huì)預(yù)先對(duì)多個(gè)整數(shù)列執(zhí)行categorize把連續(xù)整數(shù)映射為類別用于模擬 groupby/binby 常見的類別列場(chǎng)景self.df.categorize(self.df.i8_10, min_value5, max_value15, inplaceTrue) self.df.categorize(self.df.i8_1K, min_value5, max_value1_0005, inplaceTrue) self.df.categorize(self.df.i8_1M, min_value5, max_value1_000_0005, inplaceTrue)計(jì)時(shí)方法以 time_ 為前綴每個(gè)time_方法即一條獨(dú)立的計(jì)時(shí)基準(zhǔn)。以 strings.py 為例它覆蓋了 20 余種字符串操作的性能例如def time_capitalize(self, N): self.df.s.str.capitalize().nop() def time_contains_regex(self, N): self.df.s.str.contains(9, regexTrue).nop() def time_replace_regex(self, N): self.df.s.str.replace(1?[45]4, 1004, regexTrue).nop() def time_split_and_join(self, N): self.df.s.str.split(.).str.join(-).nop()注意這里的nop()是 Vaex 提供的執(zhí)行但不返回結(jié)果的方法用于強(qiáng)制觸發(fā)完整的表達(dá)式求值否則惰性求值下表達(dá)式可能不會(huì)真正執(zhí)行從而測(cè)得真實(shí)的端到端耗時(shí)。聚合與過(guò)濾類基準(zhǔn)同理例如 aggregates.py 中的一維/二維分箱計(jì)數(shù)def time_count_x_binby128(self, N): self.df.count(x, binbyx, limits[-1, 1], shape128) def time_count_star_x4(self, N): self.df.count(binby[self.df.x4, self.df.y4], limits[-1, -1], shape128)函數(shù)式基準(zhǔn)export.py 的寫法除了類ASV 也支持函數(shù)式基準(zhǔn)。在 export.py 中可以看到一種更輕量的寫法通過(guò)給函數(shù)設(shè)置.setup、.params、.param_names屬性完成聲明def time_export_plain(N, M): with tempfile.TemporaryDirectory() as tmpdir: df.export_hdf5(os.path.join(tmpdir, bench.hdf5)) time_export_plain.setup setup_df time_export_plain.params [[1024**2, 1024**2*16], [1, 4, 16]] time_export_plain.param_names [N, M]setup_df負(fù)責(zé)構(gòu)造 N 行、M 列的浮點(diǎn) DataFrametime_export_plain則把整個(gè) DataFrame 導(dǎo)出為 HDF5衡量 1 列 / 4 列 / 16 列場(chǎng)景下的序列化吞吐。函數(shù)式寫法更適合單一、自包含的基準(zhǔn)類寫法則適合共享數(shù)據(jù)準(zhǔn)備的成組基準(zhǔn)。本地開發(fā)快速驗(yàn)證基準(zhǔn)測(cè)試編寫或修改基準(zhǔn)后先用開發(fā)模式快速試跑。按 benchmarks/README.rst本地驗(yàn)證的命令為# 運(yùn)行某個(gè)基準(zhǔn)套件例如 Strings只重復(fù)一次使用當(dāng)前 Python 環(huán)境 asv dev --bench Stringsasv dev的特點(diǎn)只運(yùn)行一次不進(jìn)行多輪重復(fù)取中位數(shù)速度極快適合驗(yàn)證基準(zhǔn)是否可運(yùn)行、結(jié)果量級(jí)是否合理復(fù)用當(dāng)前環(huán)境不會(huì)創(chuàng)建新 Conda 環(huán)境避免每次驗(yàn)證都要重新解析依賴--bench參數(shù)支持子串匹配例如--bench Strings只運(yùn)行Strings類下的所有計(jì)時(shí)方法也可用--bench Aggregate匹配聚合相關(guān)基準(zhǔn)。在跑asv dev之前建議先確認(rèn)基準(zhǔn)數(shù)據(jù)存在。以字符串基準(zhǔn)為例首次運(yùn)行會(huì)觸發(fā) fixtures.py 的generate_strings()在~/.vaex/benchmarks/下生成包含 1 億行strings_8.hdf5的 HDF5 數(shù)據(jù)集包含順序整數(shù)及其字符串表示兩列。數(shù)據(jù)生成后會(huì)被復(fù)用后續(xù)基準(zhǔn)運(yùn)行無(wú)需重建。本地完整運(yùn)行全量基準(zhǔn)驗(yàn)證通過(guò)后可在筆記本/工作站上跑一次完整基準(zhǔn)。同樣復(fù)用當(dāng)前 Python 環(huán)境asv run --python$(which python)asv run是 ASV 的標(biāo)準(zhǔn)運(yùn)行命令未加參數(shù)時(shí)默認(rèn)對(duì)當(dāng)前檢出代碼運(yùn)行全部基準(zhǔn)--python$(which python)明確指定使用當(dāng)前 Python 解釋器而不是由 ASV 自動(dòng)創(chuàng)建 Conda 環(huán)境——這保證了本地開發(fā)與生產(chǎn)環(huán)境行為一致但開銷更低默認(rèn)會(huì)對(duì)每個(gè)基準(zhǔn)進(jìn)行多次重復(fù)如--repeat控制重復(fù)次數(shù)并匯總統(tǒng)計(jì)量均值、標(biāo)準(zhǔn)差等。運(yùn)行結(jié)果會(huì)寫入.asv/results/目錄下的 JSON 文件中隨后可通過(guò)asv publish生成 HTML 報(bào)告用asv preview在本地瀏覽器查看趨勢(shì)圖。提示本地完整運(yùn)行耗時(shí)較長(zhǎng)strings 基準(zhǔn)單次超時(shí)就設(shè)定了 3600 秒。建議開發(fā)階段先用asv dev --bench 你的新基準(zhǔn)名驗(yàn)證再在專用硬件上跑完整矩陣。生產(chǎn)環(huán)境自動(dòng)化基準(zhǔn)管線Vaex 的基準(zhǔn)并非只在開發(fā)機(jī)運(yùn)行而是有一套完整的自動(dòng)化流程。按 benchmarks/README.rst 的描述其工作流程為cron 觸發(fā)一個(gè) cron 任務(wù)定時(shí)調(diào)用 bin/benchmark_new_commits.sh切到 master腳本強(qiáng)制將工作區(qū)重置為vaex倉(cāng)庫(kù)的master分支最新提交基準(zhǔn)測(cè)試代碼一律取自master測(cè) master 新提交先對(duì)master上尚未基準(zhǔn)過(guò)的新提交運(yùn)行基準(zhǔn)測(cè) bench分支*若存在bench*前綴的分支則對(duì)origin/master..origin/branch之間的增量提交運(yùn)行基準(zhǔn)——注意基準(zhǔn)測(cè)試代碼仍取自master因此這種方式適用于改進(jìn)既有基準(zhǔn)而不適合開發(fā)新基準(zhǔn)新基準(zhǔn)應(yīng)合入master后再運(yùn)行合并歷史將新結(jié)果與vaex-asv倉(cāng)庫(kù)中歸檔的.asv/results/**/*.json合并回該倉(cāng)庫(kù)并推送從而保留完整歷史發(fā)布 HTMLasv publish生成靜態(tài) HTML 并拷貝到基準(zhǔn)機(jī)的 Web 目錄結(jié)果即可在 ASV 報(bào)告站點(diǎn)上公開訪問(wèn)。調(diào)度腳本源碼解讀bin/benchmark_new_commits.sh 用 Bash 實(shí)現(xiàn)了上述流程幾個(gè)關(guān)鍵函數(shù)值得逐一看結(jié)果恢復(fù)——每次運(yùn)行前從 vaex-asv 倉(cāng)庫(kù)拉取并恢復(fù)歷史結(jié)果保證結(jié)果連續(xù)可追溯function restore_results_from_git () { # copy results from vaex-asv/.asv/results/**.json to vaex/.asv/results/**.json (cd ../vaex-asv git pull -f) (mkdir -p .asv) (mkdir -p ../vaex-asv/.asv/results/) echo Restoring the following results from vaex-asv repo: find ../vaex-asv/.asv/results/ cp -r ../vaex-asv/.asv/results/ .asv/ }分支發(fā)現(xiàn)——找出所有以bench開頭的遠(yuǎn)端分支作為候選測(cè)試目標(biāo)function get_additional_branches_to_benchmark () { # find branches which start with bench* in the origin git branch -a | grep origin/bench | sed -e s/.*origin\/\(.*\)/\1/ }主流程——支持兩種模式帶--only-last參數(shù)時(shí)只測(cè)master最新一個(gè)提交用于機(jī)器初始化驗(yàn)證否則測(cè)master全部新提交再對(duì)每個(gè) bench* 分支測(cè)其相對(duì)master的增量提交if [[ $1 --only-last ]] then echo Benchmarking last commit on master asv run else echo Benchmarking new commits on master (asv run NEW) || (echo Maybe no new commits to benchmark?) for branch in $(get_additional_branches_to_benchmark) do echo Benchmarking commits on ${branch} asv run origin/master..origin/${branch} done fi # generate HTML asv publish store_and_push_results_in_git copy_results_to_www其中asv run NEW中的NEW是 ASV 對(duì)自上次運(yùn)行以來(lái)新增提交的引用名配合--set-commit-hash可將結(jié)果掛到具體提交上asv run origin/master..origin/branch用 git 的 range 語(yǔ)法圈定要測(cè)的提交范圍asv publish把 JSON 結(jié)果聚合為 HTML 報(bào)告store_and_push_results_in_git將結(jié)果拷貝回 vaex-asv 倉(cāng)庫(kù)并git commitgit push完成歷史歸檔copy_results_to_www把.asv/html/*拷貝到/var/www/asv.vaex.io/html/即 Web 服務(wù)器根目錄供外部訪問(wèn)。從腳本可以看到整個(gè)管線刻意保持了主倉(cāng)庫(kù) 獨(dú)立結(jié)果倉(cāng)庫(kù)vaex-asv的分離vaex主倉(cāng)庫(kù)只包含基準(zhǔn)代碼性能歷史數(shù)據(jù)全部沉淀在 vaex-asv 倉(cāng)庫(kù)中避免主倉(cāng)庫(kù)因頻繁寫入結(jié)果 JSON 而膨脹。從零搭建基準(zhǔn)運(yùn)行機(jī)初始設(shè)置 8 步benchmarks/README.rst 給出了一套完整的新機(jī)器初始化清單可用于搭建新的專用基準(zhǔn)運(yùn)行機(jī)1. 創(chuàng)建專用 Unix 用戶例如github讓基準(zhǔn)運(yùn)行與日常操作隔離。2. 配置 SSH 部署密鑰生成 SSH key并將其添加為 vaex-asv 倉(cāng)庫(kù)的 Deploy key使該用戶具備推送結(jié)果提交的權(quán)限。3. 克隆兩個(gè)倉(cāng)庫(kù)git clone gitgithub.com:vaexio/vaex.git git clone gitvaexio/vaex-asv.git # 結(jié)果歸檔倉(cāng)庫(kù)實(shí)際地址以你的配置為準(zhǔn)4. 配置 git 提交身份用于生成基準(zhǔn)結(jié)果提交git config --global user.name Vaex GitHub Integration git config --global user.email githubvaex.io5. 安裝 Miniconda 并安裝 ASVconda install asv -c conda-forge6. 配置機(jī)器參數(shù)運(yùn)行asv machine將 CPU 型號(hào)、核數(shù)、內(nèi)存等硬件信息寫入~/.asv-machine.json。這一步很關(guān)鍵——ASV 依賴該文件識(shí)別運(yùn)行機(jī)并據(jù)此在結(jié)果中標(biāo)注機(jī)器標(biāo)識(shí)。7. 首次試跑執(zhí)行bin/benchmark_new_commits.sh --only-last只對(duì)master最新提交跑一次基準(zhǔn)確認(rèn)管線端到端可用并初始化結(jié)果歷史。8. 注冊(cè) cron 定時(shí)任務(wù)例如每 8 小時(shí)運(yùn)行一次。在crontab -e中寫入PATH/home/github/miniconda3/bin:/home/github/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0 */8 * * * /home/github/vaex/bin/benchmark_new_commits.sh /home/github/log/benchmark-run-$(date \%Y-\%m-\%d_\%H-\%M-\%S).log 21注意 cron 行中的兩個(gè)要點(diǎn)PATH 必須顯式寫出cron 環(huán)境 PATH 極簡(jiǎn)不包含 Miniconda 的 bin 目錄若不配置則asv、conda等命令將無(wú)法執(zhí)行日志重定向把 stdout/stderr 重定向到帶時(shí)間戳的日志文件date格式中的%需在 cron 中寫成\%轉(zhuǎn)義方便事后排查某輪運(yùn)行是否失敗。另外建議先mkdir /home/github/log/創(chuàng)建日志目錄。生產(chǎn)環(huán)境下ASV 每次運(yùn)行都會(huì)創(chuàng)建新的 Conda 環(huán)境基于asv.conf.json或倉(cāng)庫(kù)聲明的依賴矩陣保證不同運(yùn)行之間的依賴環(huán)境可復(fù)現(xiàn)、可比對(duì)?;鶞?zhǔn)數(shù)據(jù)集fixtures 的生成邏輯基準(zhǔn)的可復(fù)現(xiàn)性依賴固定的測(cè)試數(shù)據(jù)。benchmarks/fixtures.py 提供了兩個(gè)生成函數(shù)數(shù)據(jù)文件統(tǒng)一落在~/.vaex/benchmarks/私有目錄下已存在則跳過(guò)生成generate_strings()生成 1 億行字符串?dāng)?shù)據(jù)strings_8.hdf5一列為順序整數(shù)一列為整數(shù)的字符串表示。生成后還會(huì)shuffle()打亂順序再導(dǎo)出模擬真實(shí)數(shù)據(jù)的隨機(jī)分布nmax 8 filename fstrings_{nmax}.hdf5 path os.path.join(vaex.utils.get_private_dir(benchmarks), filename) if not os.path.exists(path): x np.arange(0, int(10 ** nmax)) s x.astype(str) df_vaex vaex.from_arrays(xs, ss) df_vaex.shuffle().export(path, progressFalse)generate_numerical()生成數(shù)值基準(zhǔn)數(shù)據(jù)numerical_8-b.hdf5設(shè)計(jì)了一套分層測(cè)試矩陣x/yfloat64標(biāo)準(zhǔn)正態(tài)分布x4/y4為其 float32 版本用于對(duì)比精度對(duì)性能的影響iB_1010 個(gè)在 515 之間的隨機(jī)整數(shù)B ∈ {1,2,4,8}對(duì)應(yīng) int8 到 int64用于測(cè)試小基數(shù)分箱/分組iB_100100 個(gè) 5105 的隨機(jī)整數(shù)iB_1K1000 個(gè) 51005 的隨機(jī)整數(shù)int16 起iB_1M100 萬(wàn)個(gè) 51,000,005 的隨機(jī)整數(shù)int32 起用于測(cè)試高基數(shù)分組時(shí)的哈希表性能。i10 np.random.randint(5, 10 5, N, dtypenp.int64) i100 np.random.randint(5, 100 5, N, dtypenp.int64) i1K np.random.randint(5, 1000 5, N, dtypenp.int64) i1M np.random.randint(5, 1_000_000 5, N, dtypenp.int64)從源碼可以推斷這套數(shù)據(jù)刻意覆蓋基數(shù)從 10 到 100 萬(wàn)跨五個(gè)數(shù)量級(jí) 整數(shù)位寬從 8 到 64 位跨四個(gè)檔位的組合從而系統(tǒng)性地檢驗(yàn) Vaex 在不同哈希密度下的分組、分箱、isin、去重等核心算子性能。例如 aggregates.py 的BinByCat1M類就只對(duì) 4 字節(jié)與 8 字節(jié)的 100 萬(wàn)基數(shù)列做分箱測(cè)試params Aggregates.params ([4, 8],)isin.py 則將候選集合大小從 1 一直參數(shù)化到 100 萬(wàn)觀察isin在哈希表擴(kuò)展過(guò)程中的行為。常見基準(zhǔn)場(chǎng)景一覽結(jié)合源碼可以梳理出 Vaex 基準(zhǔn)覆蓋的核心性能面便于你定位與擴(kuò)展字符串處理strings.py大小寫轉(zhuǎn)換、trim、補(bǔ)齊、正則匹配/替換、split/join、子串定位等 20 個(gè)計(jì)時(shí)方法全部基于 1 億行字符串列聚合與統(tǒng)計(jì)aggregates.pycount()、均值、一維/二維 binbyshape128、按不同基數(shù)類別列分箱GroupBygroupby.py、groupbyh2o.py按 100 基數(shù)、100 萬(wàn)基數(shù)及 2 的冪次列分組計(jì)數(shù)過(guò)濾后訪問(wèn)filter.py構(gòu)造布爾過(guò)濾后的 DataFrame測(cè)head()、tail()、count()的緩存命中性能成員判斷isin.py數(shù)值與字符串列的isin參數(shù)化候選集大小導(dǎo)出export.py不同行列規(guī)模的 HDF5 導(dǎo)出吞吐含相關(guān)列sum派生列導(dǎo)出場(chǎng)景。結(jié)語(yǔ)Vaex 的基準(zhǔn)測(cè)試體系是一個(gè)本地可迭代、線上可監(jiān)控的完整閉環(huán)本地用asv dev與asv run --python$(which python)快速開發(fā)和驗(yàn)證基準(zhǔn)生產(chǎn)環(huán)境則由 cron 驅(qū)動(dòng) bin/benchmark_new_commits.sh對(duì)master與bench*分支的新提交自動(dòng)執(zhí)行基準(zhǔn)、把結(jié)果歸檔到獨(dú)立結(jié)果倉(cāng)庫(kù)、并發(fā)布為靜態(tài) HTML 報(bào)告。如果你正在為 Vaex 貢獻(xiàn)性能優(yōu)化或新增基準(zhǔn)推薦的實(shí)操路徑是閱讀 benchmarks/fixtures.py 理解現(xiàn)有數(shù)據(jù)集設(shè)計(jì) → 參照 benchmarks/strings.py 或 benchmarks/aggregates.py 的類結(jié)構(gòu)編寫新基準(zhǔn) → 用asv dev --bench 你的基準(zhǔn)名快速驗(yàn)證 → 合入master后由專用硬件接管長(zhǎng)期監(jiān)控。這樣既能保證每次提交的性能變化被及時(shí)發(fā)現(xiàn)也能讓社區(qū)的每一項(xiàng)性能工作都有數(shù)據(jù)可依。贊分享數(shù)據(jù)分析數(shù)據(jù)可視化大數(shù)據(jù)數(shù)據(jù)科學(xué)【免費(fèi)下載鏈接】vaexOut-of-Core hybrid Apache Arrow/NumPy DataFrame for Python, ML, visualization and exploration of big tabular data at a billion rows per second 項(xiàng)目地址https://gitcode.com/gh_mirrors/va/vaex點(diǎn)擊查看免費(fèi)下載相關(guān)推薦DGL 性能基準(zhǔn)測(cè)試完全指南ASV 持續(xù)基準(zhǔn)體系、本地復(fù)現(xiàn)與歷史性能解讀DGL 性能基準(zhǔn)測(cè)試完全指南ASV 持續(xù)基準(zhǔn)體系、本地復(fù)現(xiàn)與歷史性能解讀 本文圍繞 DGL 官方性能文檔 docs/source/performance.r人工智能機(jī)器學(xué)習(xí)深度學(xué)習(xí)圖計(jì)算NetworkX 性能基準(zhǔn)測(cè)試指南基于 ASV 的基準(zhǔn)套件配置與運(yùn)行實(shí)踐NetworkX 性能基準(zhǔn)測(cè)試指南基于 ASV 的基準(zhǔn)套件配置與運(yùn)行實(shí)踐 導(dǎo)讀 本指南圍繞 NetworkX 倉(cāng)庫(kù)中的 benchmarks/README.m圖計(jì)算數(shù)據(jù)分析科學(xué)計(jì)算3 步裝好 Zola kirifuji 博客主題安裝、配置與導(dǎo)航定制3 步裝好 Zola kirifuji 博客主題安裝、配置與導(dǎo)航定制 想讓 Zola 博客換成極簡(jiǎn)紫色風(fēng)kirifuji 屬于裝完就能用的那檔。本文帶你走完靜態(tài)站點(diǎn)CLI開發(fā)工具上一篇RT-DETR 2025終極指南動(dòng)態(tài)卷積技術(shù)深度解析與實(shí)戰(zhàn)應(yīng)用下一篇如何解決Universal_Robots_ROS2_Driver常見問(wèn)題開發(fā)者必看的調(diào)試指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考