ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

“Python 不是数据科学的最佳语言!”

“Python 不是数据科学的最佳语言!” 此刻, 我已然做好了要踏入那充满语言之争乱象的这摊不干净的水里面的准备了。然而, 我得先郑重说上最为关键的一句: 就使用你最为熟悉的那个工具。比如说, 要是你熟悉某种特定情况? 那就去用那种情况所对应的方式。然后, 还要再补充说明一句: 做哪一件事情的时候, 最适合运用哪个工具, 那就选用哪个工具。要是恰好所对应的工具刚好还是那种特定情况 , 那一点问题也没有的。另外呢, 要是你本来就每日都使用某样工具, 顺手借助它去做些别的事务, 这也全然是正常的。你整日拿着锤子去敲钉子, 利用它来开启啤酒瓶, 挠挠后背, 这般也都能说得通。同样的情形, 你常年书写, 借助它顺便开展混合线性模型的相关工作, 这也并无不妥。倘若你运用起来觉得便利, 那就持续使用便可。可是要是你用着用着越发感觉得不顺畅、发觉某些事情分明不应这般困难, 那么这篇文章或许就是供你阅读的。首先, 我抛出一个看法, 那就是大家对于“是数据科学语言”这样的事情存在过度依赖的状况。它的受限情况实际上极为明显。存在诸多数据科学任务, 我宁愿选用R去达成, 也不愿意使用它。在数据科学领域它这般普及, 我觉得更多是源于历史偶然, 再加上具有一种“各方面表现都还可以”的通用性, 并非是它在数据科学方面存在某种天生优势。彼时, 我觉得, 于深度学习方面着实有着出色的表现。其成为行业标准是存在原因的。在此处我所讲的数据科学, 并不涵盖深度学习而是指别的那些工作, 即数据清洗、探索性分析、可视化、统计建模等。就像开头所讲的那样, 要是你原本有着充足的缘由每天都去使用它 比如说进行训练AI模型之类的事项, 那么顺带借助它把其余的事情一同搞定也并无不可。教深度学习课程的时候我自己便是如此这般去做的。然而这却没办法去消除我处于那个世界进行数据分析期间时常所察觉到的那种笨拙以及不便之感受。来自一线的观察讲讲本人亲身有的经历不做任何关于原因的剖析, 我带领计算生物实验室超过二十多年, 这期间同大约三十位能力出众称得上强硬的研究生以及博士后开展过合作。实验室的那般规矩是在讲: 何人能不受限制凭借自身意愿去挑采用何种打算运用的编程语言还有工具, 我从来都不会去进行干涉。结果往往是大多数人会选择 。常见的情形是这样的: 有个学生来到办公室朝着我去展示某些结果, 我会讲: “这般挺好的, 你可不可以将图选用另外一种形式去快速地绘制一下呀? ”或者是: “能否快速计算一个在脑海中刚刚浮现出来的数值, 而且绘制出来瞧瞧呵? ”类似这般的需求, 一般来讲这些都是自身明白在R里面利用几分钟便能够完成的任务, 像是把箱线图转变为小提琴图, 把折线图转变为热力图, 把直方图替换去成为密度估计, 把原始值转变为排序值之后再开展计算等等。几乎没有例外, 那些以此为用的学生, 总会给出这样的回应: “这着实需要耗费些时间, 我必须返回去深入探究一番, 待妥善处理之后再告知你。”。需着重指出的是, 这些学生均颇具实力。问题并非在于他们对工具缺乏了解, 而是工具自身好像较为拙笨, 致使我本以为是“极为简易的请求”, 却常常变得毫无简易可言。不管缘由究竟是啥, 我都实在是不得不得出一个论断, 那就是: 在数据分析方面的某些基础部分出现了结构性的问题, 这或许是语言自身的问题, 又或许是库生态的问题, 亦可能是这两者共同产生的作用, 然而结果是切实存在的, 并且我长时间都能见到类似这般的状况。事实上我再举一个例子以避免你认为“这是学生水平问题”。去年秋季时节, 我跟一位具备资深经验的数据科学家一块儿教授有关生物学的AI课程, 他开展的所有工作都使用, 对于NumPy、, 那是熟悉得不得了, 在课程上, 他承担带领学生去做练习的任务, 我则负责讲解理论知识, 如此这般使得我能够观察到一位专家在现场处理各种各样数据分析问题的情形。众多我觉得仅用R几行代码便可写好的内容, 在那里却演变成又长且绕的情况。致使我常常这般反应: “为何会被写得如此复杂? ”那模样甚是如此。要是我自己不投入大量时间去令大脑重新接受训练, 去适应全然不同的编程思考方式, 根本就没办法写出相应的代码。这种陌生感并非是那种“陌生却优雅”的类型, 而是属于那种呈现出“陌生奇怪又繁琐”样子的情况了。然而, 我相当肯定, 缘由并非在于我的同事, 他是极为出色的。实际上的问题, 好像是存在于这般工具的底层规划方面。什么才是适合数据科学的语言进到一步来讲之情形下, 于挑选数据科学语言之际存在着相应一些基本考量, 此处所讲的数据科学, 乃是指剖析数据以及总结归纳数据, 寻觅其中模式并且拟合模型, 绘制可视化呈现, 也便是科研工作者于日常数据分析过程里会去做的全部工作, 这并非等同于数据工程或应用开发, 情况就是如此。交互式探索对数据科学来讲是高度依赖的, 大量快速试验性的分析是其所需的。所以, 适合数据科学的语言得支持解释执行, 且能应用于交互式 Shell 里头。而性能是次要方面哟。比如说在做线性回归之时, 50ms 或者 500ms 是根本不会被在意的所关心的在于: 能不能眨眼间就开启 Shell, 写上几行代码, 短短几分钟就收获结果, 而非去创建新工程, 编写一堆模板代码, 讨好编译器, 并且还要耗费比运行更漫长的时间去等待编译完成。倘若交互性以及低启动成本属于必需条件, 那么候选便自然落在, 诸如、R、、这类脚本或者数据科学语言之上。其中同样包括Julia, 不过说实话, 我对于 Julia 的了解尚不充分, 不便于进行评价。其或许极为出色, 然而我也目睹不少深度用户对它持有保留态度。本文暂且不做展开论述。像、之类的商业语言, 还有缺乏生态的, 均先搁置一旁。实际的选择即为 R 和。在继续有关内容之前, 我打算补充一下针对性能方面的看法。性能往往需要以舍弃语言的 other 特性作为代价, 这包括程序员会面临额外负担, 就像 Rust 那样, 存在更高的隐蔽 bug 风险, 如同 C 语言, 或者是二者兼具的情况。在数据科学领域当中, 高 bug 风险是无法被接受认可的, 并且对于程序员而言便利性要远比极致性能为更甚同等层面重要所在地位情况。电脑已然具备足够快的速度了, 然而思考是会带来痛感的。我更倾向于少花费些心力来告知电脑需要履行怎样行为动作 而是宁愿多等待些许的时间。当存在真正的性能瓶颈之际, 等到明确需求之后 我能够完全将关键路径重写为 Rust 语言。把“逻辑”与“搬运工作”分开使分析不朝着更具难度的方向发展的要点, 在于将“分析的逻辑”跟“达成的具体细节”予以分开。我期望借助概念方面的表述去编写分析代码, 即: 对待数据应采取怎样的处置方式, 目标是怎样的而不愿不得不去顾虑底层的细节构成, 诸如数据呈现的类型、数字所对应的索引、循环的方式, 以及手动进行数据表格的拆解与组合等情况。只要我开始管这些事那多半是在被“繁琐的机械劳动”拖累。拿出一个例子, 来瞧一瞧群岛的企鹅数据集。当中存在着三种企鹅, 分布于三座岛上。假定我打算计算“岛 × 物种”这两个维度下的体重均值以及标准差, 并且排除掉体重缺失的记录。能让我以接近自然的语言方式去完成这个任务所用代码量与我刚用英语描述的句子词汇量差不多这样才算作为优秀的理想的数据科学语言, 而且R和都予以做得到, 只是两者之间难易程度差别比较大。下面是使用 风格的 R 代码library(tidyverse)library(palmerpenguins)penguins |filter(!is.na(body_mass_g)) |group_by(species, island) |summarize(body_weight_mean mean(body_mass_g),body_weight_sd sd(body_mass_g))再来看等价的 代码使用 完成相同任务import pandas as pdfrom palmerpenguins import load_penguinspenguins load_penguins(penguins.dropna(subset[body_mass_g]).groupby([species, island]).agg(body_weight_mean(body_mass_g, mean),body_weight_sd(body_mass_g, std)).reset_index)这俩例子在整体范畴之内拥有着极为相像的特性。对于以这般规模呈现的分析任务来讲, 其实际完成的状况表现得还算可以。从我个人主观的角度去进行认知与判断, R语言所具备的代码在可被阅读与理解的属性方面略微展现出更优的态势需要着重留意 的内部存在着多么大量的引号以及括号, 不过这种差异的程度并不是特别显著。两者的流程同样是这样的: 获取数据集, 去除掉体重存在缺失情况的记录, 按照“物种 × 岛屿”进行分组, 之后分别去计算均值以及标准差。对比一下, 仅使用, 基础语法, 完全不, 依赖数据, 处理库时, 的等价版本。from palmerpenguins import load_penguinsimport mathpenguins load_penguins# Convert DataFrame to list of dictionariespenguins_list penguins.to_dict(records)# Filter out rows where body_mass_g is missingfiltered [row for row in penguins_list if not math.isnan(row[body_mass_g])]# Group by species and islandgroups {}for row in filtered:key (row[species], row[island])if key not in groups:groups[key] groups[key].append(row[body_mass_g])# Calculate mean and standard deviation for each groupresults for (species, island), values in groups.items:n len(values)# Calculate meanmean sum(values) / n# Calculate standard deviationvariance sum((x - mean) ** 2 for x in values) / (n - 1)std_dev math.sqrt(variance)results.append({species: species,island: island,body_weight_mean: mean,body_weight_sd: std_dev})# Sort results to match order used by pandasresults.sort(keylambda x: (x[species], x[island]))# Print resultsfor result in results:print(f{result[species]:10} {result[island]:10} fMean: {result[body_weight_mean]:7.2f} g, fSD: {result[body_weight_sd]:6.2f} g)这一段代码显著地长得多, 其中四处都是循环, 并且还需要将数据集拆开, 之后再重新拼接回去。不论你偏好哪一种语言, 应该都能够察觉出来: 不用去理会这些芜杂琐碎的步骤, 直接去表述你所要做之事的版本, 相较于被一系列繁杂事务拖住的版本要好出许多。简要来讲, 本人认为, 代码动辄沦为“苦力之事”, 缘由在于, 不管你何等渴望维持高层抽象且书写得清爽一些, 语言自身或其库总会横生事端, 致使你被迫去应对那些底层细节。2025年, 是C正式发布后历经的40周年, 同时, 也是全球C及系统软件技术大会举办达20周年的时候。在此一回, C之父会再度来到「2025全球C及系统软件技术大会」的现场, 跟全球顶级的系统软件工程师、编译器专家、AI基础设施研究者一起进行对话表达观点。此次大会总共设置了十二大主题, 分别是现代 C 最佳实践, 架构与设计演化, 软件质量建设, 安全与可靠, 研发效能, 大模型驱动的软件开发, AI 算力与优化, 异构计算, 高性能与低时延, 并发与并行, 系统级软件, 嵌入式 系统, 这些共同构筑起了一个周全且立体的知识框架, 保证每一位参会人员, 把语言爱好者、系统架构师、性能优化工程师以及技术管理者包含在内, 都能够于此处寻觅到自身的定位, 获取到深刻的见识与启迪。详情参考官网:
返回列表