【发布时间】:2015-10-03 10:32:27
【问题描述】:
在我从事 Python 开发的这些年里,我一直惊讶于如果你设法重写循环通过你的 ndarray 并执行某些操作的代码,并且使用在整个数组上工作的 numpy 函数,事情变得如此之快。一次。最近我越来越多地切换到节点,我正在寻找类似的东西。到目前为止,我发现了一些东西,但没有一个看起来很有希望:
- scikit-node,在 python 中运行 scikit-learn,并与 node.js 接口。我没有尝试过,但我不认为它会给我带来我想要的最先进的速度。
- 有一些相当古老和更新的 javascript 矩阵库(sylvester、gl-matrix、...)。除了不确定它们是否能很好地处理大于 4x4 的矩阵(这在 3D 渲染中最有用)之外,它们似乎是原生 javascript(有些不确定,它们使用 webGL 加速)。在浏览器上很好,在节点上则不然。
据我所知,npms 可以用 C++ 编写,所以我想知道为什么 node.js 没有类似 numpy 的库。需要这种权力的社区是否对节点没有足够的兴趣?是否有希望 ES6 特性(列表推导)允许 javascript 编译器自动将原生 JS 代码矢量化为 C++ 速度?我可能还缺少其他东西吗?
编辑,回应近距离投票:注意,我不是在问“什么是做 xyz 的最佳包”。我只是想知道是否有技术原因没有在节点上执行此操作的包、社会原因或根本没有原因,而我只是错过了一个包。也许为了避免太多自以为是的批评,我想知道:我有大约 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 可能很难添加良好的支持,而不是破解引擎本身——这会破坏目的。再说一次,我没有进一步研究这最后的陈述。
【问题讨论】:
-
Edge 将支持 SIMD,如果这与您所说的完全接近的话。还可以检查 [].map(),它可以执行
["A","B","c"].map(Function.call.bind("".toLowerCase))之类的操作 -
据我所知,edge 是一个节点 - .net 桥,对吧?我不确定这有什么帮助。我熟悉 map() 函数调用,但在我的测试中,以这种方式将 2 个矩阵加在一起甚至达不到 numpy 做同样事情的速度(我可以想象;这一定很难弄清楚对于编译器来说,在合理的时间内发生了什么)。
-
asm 可以以大约 90% 的原始性能运行 llvm 代码。加载需要很长时间,但运行速度很快。使用 webassembly,加载时间将减少 90%,运行性能会略微提高。从现在开始,动态语言将比预编译代码更快,因为运行时优化考虑了编译器没有的输入,而其余的仍然是 JIT 和快速的。您还可以在不重新编译的情况下升级动态应用程序的性能(例如升级 V8),这是对较小且不断缩小的性能差异的权衡。
-
检查npmjs.com/package/numjsnumjs
-
因为 numjs 对我来说看起来像纯 javascript,我希望它只给你 numpy 接口,而不是速度。不过还没有测试过。
标签: javascript c++ node.js numpy multidimensional-array