从Scheme操纵Numpy

By guenchi at 2018-12-14 • 3人收藏 • 849人看过


https://github.com/guenchi/Darkart


欢迎大家试用,之后会进一步包装,让跨语言调用更容易。


希望大家对Chez Scheme的发展更有信心,以前说库少是很大一部分人看不起Scheme的理由,随着FLI的发展,将会支持从Chez Scheme调用大多数语言的库。以后库的数量可以直接碾压Clojure。


关于调用Python库的效率问题:

  1. 调用时大多数计算是放在底层C/Fortran库,中间Python的运算量并不大。

  2. Chez对Python数据进行操作时,基本只是传递指针,并不会频繁的跨语言传值和拆装PythonObject,所以并不比Python调用这些库多消耗多少。

  3. 一些数据准备从Python移到了Chez这边,所以总体看来甚至可能比Python原生更快。

  4. 可以从Chez分线程开多个Python库并行,完美规避GIL限制。

13 个回复 | 最后更新于 2019-06-07
2018-12-14   #1

加油!!!!~~~

2018-12-30   #2

第一版已经可以运行了


测试结果来看 比Python直接调用Numpy要快


最近一个星期300个提交了... 


每天只睡了3-4小时..


不过成效显著 现在项目已经被好几个大佬关注了

2019-03-21   #3

你好,我对Lisp的科学计算库非常感兴趣,虽然我用的是Common Lisp。

关于Numpy的子矩阵有几个细节问题请教一下,,虽然不是lisp相关问题,还是希望不吝赐教。


  1. 在复制一个矩阵的子矩阵到一个新的矩阵的时候,Numpy是用C程序的函数直接复制,还是同python复制的?比如一个5x5矩阵A,令B = np.array (A[1:3:2, 0:4:4])这种操作,新生成的B的数据是用python从A中复制过去的,还是有C的函数?

  2. 在对子矩阵做线性代数的时候,是先复制出一个新的矩阵然后调用BLAS和LAPACK,还是直接在原矩阵上调用呢?因为有些时候LAPACK和BLAS的函数可能不能刚好从原矩阵中扣出想要的子矩阵,所以我怀疑是先复制出一个矩阵。

2019-03-26   #4

回复#3 @physcrf :


1. Numpy内置函数都是fortran和c写的,不会从python层面复制。


你举的例子,是将原矩阵(A)的数据复制到 C或Fortran的内存结构(array方法可选参数)。从C方面来看,A是一个结构体。(Python的数据类型全是结构体)


2. 线性代数,这个分不同的函数了。


有的函数直接在原矩阵上操作,有的函数会重新生成新的内存空间,复制一份。


从C API来看,凡是返回 0,-1等的,属于前者,返回指针的,属于后者。

2019-03-27   #5

回复#4 @guenchi :


这么看的话应该是Numpy自己从C语言内建了切片,索引的等操作。

单纯的BLAS应该没有提供这么丰富操作。

线性代数应该是调用的LAPACK,有些子矩阵的位置没有办法直接调用LAPACK,所以需要复制一份副本单独占一片连续内存再应用LAPACK。


我最近再想怎么在CL里面实现类似Numpy的库,谢谢提供思路。另外问一句,Numpy有一个类似libnumpy.so的东西吗?还是有好几个?


多谢

2019-03-28   #6

回复#5 @physcrf :


这么看的话应该是Numpy自己从C语言内建了切片,索引的等操作。


=> C 和 Fortran,Numpy一些操作是在Fortran方式的内存上建立的(所以快)


BLAS属于Numpy的依赖库,(所以不是全部),安装Numpy的时候可以手动切换BLAS库来达到更高的速度。


重新实现的话,没有必要,这个轮子太大了。。。


也许你说的是从CL去调用Numpy,就像Darkart做的,这其实很简单,通过CL的FFI去链接libnumpy.so就行(也许需要C做一个Warp)

2019-03-28   #7

回复#6 @guenchi :

OK, 只要知道有libnumpy.so存在,事情就简单很多了。

不过从CL本身来操纵内存,然后调用BLAS和LAPACK来做一些线性代数的操作,也许也是种可行的方案。以后有时间我再研究一下。

谢谢了哈

2019-03-29   #8

回复#7 @physcrf :


Numpy优化的时间太久了


不要做重复造轮子的工作


另外,Numpy array内存的排布可能对Fortran比较友善,所以CL直接读取也许会取得不了好效果。


在一些其他的计算上,你可以试试直接调用 OpenBLAS。(这是一个比Numpy自带BLAS高效许多的实现)

2019-03-29   #9

回复#8 @guenchi :


反正各个BLAS接口都是一样的,这个问题到不大。我之后再慢慢研究一下,谢谢了哈

2019-05-11   #10

我翻了一下numpy的代码,感觉功能太复杂了。所以我自己写了轻量级的narray,类似numpy的ndarray。提供了一些和common lisp的array类似的接口,代码也比较简单,欢迎大家围观。

https://github.com/physcrf/narray

数据是C内存风格存储的,之后有时间我再慢慢加上blas和lapacke的支持,争取实现基础的科学计算功能。

2019-05-30   #11

回复#2 @guenchi :

theschemer可以做一下apache arrow的binding么,感觉这个项目挺牛的

2019-05-30   #12

回复#10 @physcrf :

加油!

2019-06-07   #13

https://github.com/bendudson/py4cl

最近发现了个在cl中调用Python的库,目前没有到quicklisp的仓库里面。看起来还是挺不错

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...