javascript - 类似 numpy 的 Node 包

标签 javascript c++ node.js numpy multidimensional-array

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.


去年关闭。







Improve this question




在我从事 Python 开发的这些年里,我总是惊讶于如果你设法重写那些循环通过你的 ndarray 并执行某些操作的代码,并且使用一次在整个数组上工作的 numpy 函数,事情变得如此之快。最近我越来越多地切换到 Node ,我正在寻找类似的东西。到目前为止,我已经发现了一些东西,但没有一个看起来很有希望:

  • scikit-node ,在 python 中运行 scikit-learn,并与 node.js 接口(interface)。我还没有尝试过,但我不希望它能给我带来我想要的尖端速度。
  • 有一些相当古老和更新的 javascript 矩阵库(sylvestergl-matrix、...)。除了不确定它们是否能很好地处理大于 4x4 的矩阵(这在 3D 渲染中最有用)之外,它们似乎是原生 javascript(有些不确定,它们使用 webGL 加速)。在浏览器上很好,在 Node 上不是这样。

  • 据我所知,npms 可以用 C++ 编写,所以我想知道为什么没有类似 numpy 的 node.js 库。需要这种权力的社区是否对 Node 没有足够的兴趣?是否有希望 ES6 特性(列表推导)允许 javascript 编译器自动将原生 JS 代码矢量化为 C++ 速度?我可能还缺少其他东西吗?

    编辑 ,作为对近距离投票的回应:注意,我不是在问“什么是做 xyz 的最佳包”。我只是想知道是否有技术原因没有在 Node 上执行此操作的包、社会原因或根本没有原因,而我只是错过了一个包。也许为了避免太多自以为是的批评,我想知道:我有大约 10000 个矩阵,每个矩阵都是 100 x 100。将它们加在一起的最佳(*校正,合理的快速)方法是什么?

    编辑2
    经过更多的挖掘,结果发现我在谷歌上搜索错误的东西。谷歌“node.js 科学计算”,有一些非常有趣的注释的链接:
  • https://cs.stackexchange.com/questions/1693/a-faster-leaner-javascript-for-scientific-computing-what-features-should-i-kee
  • http://www.quora.com/Can-Node-js-handle-numerical-computation-the-same-way-that-languages-like-R-or-Julia-can
  • Javascript and Scientific Processing?

  • 基本上据我现在了解,到目前为止没有人打扰过。此外,由于 js TypedArrays 中存在一些重大遗漏(例如 64 位整数),因此仅使用 NPM 可能很难添加良好的支持,而不是破解引擎本身——这会破坏目的。再说一次,我没有进一步研究这最后的陈述。

    最佳答案

    不,对于 Node.js 和更普遍的 JavaScript 不存在类似 numpy 的包没有技术原因。

    有两个主要障碍阻止 Node.js 和 JavaScript 在数据科学和数值计算社区中获得更多的思想份额。

    第一个障碍是社区。尽管 JavaScript 社区很大,但在该社区中从事数字计算有趣事情的人却很少。因此,如果您想在 JavaScript 和 Node.js 中进行数值计算,那么在此过程中寻找资源来帮助您可能会很困难,而且可能会感觉像是一种孤独的努力。

    其次,缺乏可比较的库(鸡和蛋:需要库来吸引库作者,需要作者来编写好的库)。库不能用 JavaScript 编写或利用 Node.js(例如,通过 native 插件)没有技术原因。我知道,因为我用 JavaScript 编写了许多数值计算库。因此,虽然在 JavaScript 中可以进行数值计算,但问题在于无法吸引具有足够专业知识并能够投入时间和精力编写高质量数值计算实现的开发人员。

    关于OP中提到的特定语言功能:

  • ES6/ES2015 :最近添加的语言都没有帮助或阻碍 JavaScript 中数字计算库的开发。像列表推导这样的潜在添加也不会改变游戏规则。 WebAssembly 是对 Web 平台产生影响的一个变化。使用 WebAssembly,编译 C/C++/Fortran 库以在 Web 浏览器中运行将变得更加容易。在给出这个答案的时候,WebAssembly 看起来是将 SIMD 引入网络的手段,可能会允许一些加速,尽管重点似乎是短 SIMD,而不是长 SIMD。但即使使用 WebAssembly,将数字计算库移植到 Web 也不会像点击编译按钮那么简单。数字计算代码库需要经过修改才能在 Web 上使用,即使这样,也可能需要编写更高级别的 API 来掩盖一些较低级别的功能,例如手动管理堆。
  • 原生插件 :是的, Node 模块可以编写为 native 插件,允许在 Node.js 应用程序中使用 C/C++/Fortran 代码。个人为此编写了库;例如,见 stdlib .如果做得好,Node.js 可以以与直接使用 native 实现相当的速度执行数值计算。
  • 类型化数组 : 就像现在一样,它们适用于数值计算。与 C 类似,您可以创建池化缓冲区,从而实现高效的内存重用和更好的性能。此外,与 R、Python 和 Julia 等语言类似,您可以利用类型化数组来创建 ndarray(也称为跨步数组)接口(interface)。虽然 U/Int64 整数数组在此答案时目前不可用,但(a)它们的缺席并不是一个阻碍,(b)提案正在规范级别推进,以将 U/Int64 整数数组添加到 JavaScript。同样适用于具有结构化类型的复数。

  • 我个人认为,某种形式的数值计算在 JavaScript 和 Node.js 中是不可避免的。进化力量的优势(普遍性、分布、性能)和潜在应用(边缘计算、集成机器学习、数据可视化)太强大了,以至于不支持数据科学应用,至少在基本层面上是这样。

    披露 :我和其他人目前正在开展一个项目(https://github.com/stdlib-js/stdlib),该项目旨在提供 JavaScript 和 Node.js 中的数字计算工具。

    关于javascript - 类似 numpy 的 Node 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31412537/

    相关文章:

    javascript - 如何继续在同一个 csv 文件上写入?

    javascript - 使用单选按钮使 Div 在页面上随机移动?

    javascript - 如何使用 jQuery 以编程方式选择变量内的选项

    c++ - 删除特定字符后的所有内容

    c++ - 如何检测 C++ 中的 API 中断

    node.js - 为什么在 ES6 模块中导出的对象有未定义的方法?

    node.js - 如何在 Node 服务器上读取以 application/x-www-form-urlencoded 格式接收的数据?

    javascript - 如何从函数返回不同的 promise ?

    javascript - 只是好奇如何继承 String 对象。 (原型(prototype))

    c++ - 用于 Windows 和 OpenGL 的 Qt C++ 库