当前在线人数13357
首页 - 分类讨论区 - 电脑网络 - 葵花宝典版 - 同主题阅读文章

此篇文章共收到打赏
0

  • 10
  • 20
  • 50
  • 100
您目前伪币余额:0
未名交友
[更多]
[更多]
Re: 用Clojure写了一个程序,和python差不多
[版面:葵花宝典][首篇作者:TheMatrix] , 2019年03月08日11:42:35 ,2282次阅读,68次回复
来APP回复,赚取更多伪币 关注本站公众号:
[首页][上页] [下页][末页] [分页:1 2 3 4 ]
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 41 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Wed Mar 13 21:02:28 2019, 美东)

python code is choked when dim=6, have to Ctrl-C to kill after 5 min.

clojure code finish in less 3.4154 seconds.

【 在 hci (海螺子) 的大作中提到: 】
: 这点计算,是1毫秒以内就完成的,所以你打印没有意义。
: 要么你把dim搞大一些,要么就不要打印。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 12.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 42 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Wed Mar 13 21:06:02 2019, 美东)

哇,这么快。测量时间我没经验,一般都是测量输出结果的时间。

【 在 hci (海螺子) 的大作中提到: 】
: python code is choked when dim=6, have to Ctrl-C to kill after 5 min.
: clojure code finish in less 3.4154 seconds.




--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 43 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Wed Mar 13 23:48:32 2019, 美东)

你这个算法,我为了使每一步都必须算到,我加了一个checksum函数:

;(all-paths [[[0 0]]])
(defn checksum []
    (reduce +
        (for [path (all-paths [[[0 0]]]) pos path coord pos]
            coord)))

这样最后就输出一个数,没有打印慢这个问题了。
然后我在nrepl中运行:

user=> (time (checksum))          
"Elapsed time: 48736.126768 msecs"
30400                             

将近50秒才出来,checksum为30400。
这个时间怎么解释啊?

我感觉time这个函数,或者是Clojure的函数,它不一定给你都算,似乎没算完直接给
你返回了。

【 在 hci (海螺子) 的大作中提到: 】
: (def moves [[1 2] [2 1] [-1 2] [-2 1] [1 -2] [2 -1] [-1 -2] [-2 -1]])
: (def dim 5)
: (defn- step [pos move]
:   (map + pos move))
: (defn- valid-pos? [[x y]]
:   (and (< x dim) (< y dim) (<= 0 x) (<= 0 y)))
: (defn- grow* [path]
:   (let [seen (set path)]
:     (->> path
:         first
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 44 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 01:54:15 2019, 美东)

因为Clojure是lazy的,刚才的benchmark的确是没有算出所有的值。为了比较,都用命
令行,并且打印出吧。

time python src/test/knight.py

real    0m15.619s
user    0m14.760s
sys    0m0.113s

time clj -m test.knight

real    0m12.136s
user    0m14.683s
sys    0m0.619s

Clojure命令行稍微快一些,考虑到Clojure有JVM+Clojure startup time,实际长期运
行应该要快更多,JIT根据运行的统计数据会优化,而命令行没有这个机会。

我唯一做的代码改变是加了几个type hint。type hint一加,时间减半。

(def moves [[1 2] [2 1] [-1 2] [-2 1] [1 -2] [2 -1] [-1 -2] [-2 -1]])

(def dim 5)

(defn- step [[^long x ^long y] [^long s ^long t]]
  [(+ x s) (+ y t)])

(defn- valid-pos? [[^long x ^long y]]
  (and (< x ^long dim) (< y ^long dim) (<= 0 x) (<= 0 y)))

(defn- grow* [path]
  (let [new? (complement (set path))]
    (->> path
        first
        (#(map (partial step %) moves))
        (filter #(and (valid-pos? %) (new? %)))
        (map #(cons % path)))))

(defn- grow [paths]
  (mapcat grow* paths))

(defn all-paths [init-paths]
  (-> (iterate grow init-paths)
      (nth (dec (* dim dim)))))


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 你这个算法,我为了使每一步都必须算到,我加了一个checksum函数:
: ;(all-paths [[[0 0]]])
: (defn checksum []
:     (reduce +
:         (for [path (all-paths [[[0 0]]]) pos path coord pos]
:             coord)))
: 这样最后就输出一个数,没有打印慢这个问题了。
: 然后我在nrepl中运行:
: user=> (time (checksum))          
: "Elapsed time: 48736.126768 msecs"
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 45 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 02:19:01 2019, 美东)

Clojure default的数字操作是boxed,如果算法有很多数字计算,会慢很多。这个题其
实没啥数字计算,但数字比较有点多,加type hint也时间减半。还可以加 (set! *
unchecked-math* true), 会稍微更快点。

real    0m12.053s
user    0m14.847s
sys    0m0.572s

其他Clojure的简单优化,比如用transducer (中间结果不算出来), pmap (并行map,
如果map操作很花时间的话),reducer (并行reduce,如果reduce操作很花时间的话)
, transient (暂时的mutable collection), 甚至volatile (mutable变量),这些
都不用改变程序的FP结构。可以先写FP程序,然后根据需要在hot loop的地方换成这些
优化的操作。

大的优化动作,就得改结构了,就是用mutable数组什么的,这就跟写imperative
programming一样了,我从来没用过。


【 在 hci (海螺子) 的大作中提到: 】
: 因为Clojure是lazy的,刚才的benchmark的确是没有算出所有的值。为了比较,都用命
: 令行,并且打印出吧。
: time python src/test/knight.py
: real    0m15.619s
: user    0m14.760s
: sys    0m0.113s
: time clj -m test.knight
: real    0m12.136s
: user    0m14.683s
: sys    0m0.619s
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 46 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 02:26:59 2019, 美东)

你这个checksum, 我的是13秒多。你的机器比我的慢这么多么?我的是2014年的
MacBook Pro,很老的机器了。

MacBook Pro (Retina, 13-inch, Mid 2014) 2.8 GHz Intel Core i5

"Elapsed time: 13717.127682 msecs"


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 你这个算法,我为了使每一步都必须算到,我加了一个checksum函数:
: ;(all-paths [[[0 0]]])
: (defn checksum []
:     (reduce +
:         (for [path (all-paths [[[0 0]]]) pos path coord pos]
:             coord)))
: 这样最后就输出一个数,没有打印慢这个问题了。
: 然后我在nrepl中运行:
: user=> (time (checksum))          
: "Elapsed time: 48736.126768 msecs"
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
dracodoc
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 47 ]

发信人: dracodoc (david), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 10:00:19 2019, 美东)

那clojure做ML,在计算方面会有劣势吗?龙哥全是靠JNI?

【 在 hci (海螺子) 的大作中提到: 】
: Clojure default的数字操作是boxed,如果算法有很多数字计算,会慢很多。这个题其
: 实没啥数字计算,但数字比较有点多,加type hint也时间减半。还可以加 (set! *
: unchecked-math* true), 会稍微更快点。
: real    0m12.053s
: user    0m14.847s
: sys    0m0.572s
: 其他Clojure的简单优化,比如用transducer (中间结果不算出来), pmap (并行map,
: 如果map操作很花时间的话),reducer (并行reduce,如果reduce操作很花时间的话)
: , transient (暂时的mutable collection), 甚至volatile (mutable变量),这些
: 都不用改变程序的FP结构。可以先写FP程序,然后根据需要在hot loop的地方换成这些
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 98.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 48 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 12:56:19 2019, 美东)

唯一的劣势是Clojure作ML计算的人少。

是的,龙哥的东西都是JNI。

他搞Neanderthal是为了搞贝叶斯统计推理,Bayadera,他的这个Clojure写的库,比最
常用的用C++写的stan,要快好几个数量级。

Bayadera:
61,208,576 samples in 267 ms.
4.36 ns per (computationally heavy) sample

JAGS/Stan (state-of-the-art bayesian C++ tools):
20,000 samples in 180/485 seconds
9 ms per sample

2,000,000 × faster per sample,more precise results, 1000 × faster

stan是哥伦比亚的统计学大佬Andrew Gelman带的40多人的团队用C++写的,龙哥是贝尔
格莱德大学的软件工程教授,一个人用Clojure手撸一切。

作为软件工程教授,龙哥坚持用Clojure,自然有他的道理,其实都不外乎我在这个板
上反复说的这些事。

现在龙哥正在科普手撸一个DL framework。这事其实是另外一个搞NLP出生的牛人,就
是那个最近华人圈爆红的清华女孩的一个斯坦福师兄(这个中国女孩算这个师门里面比
较差的了吧,我不认为她能一个人手撸一个DL框架),用Neanderthal已经干过的事,
我在这儿也提过,叫flare,发现比pytorch快。

总的来说,在计算机行业,软件的质量都是取决于人,不取决于工具。一个人顶10个人
是少说了,其实一个应该顶100个。

【 在 dracodoc (david) 的大作中提到: 】
: 那clojure做ML,在计算方面会有劣势吗?龙哥全是靠JNI?



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
magliner
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 49 ]

发信人: magliner (magliner), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 13:49:02 2019, 美东)

andrew gelman我有印象, 他和他内人是同行.  这人是不是大佬不敢说, 最大的贡献
我看就是向大众普及统计与政治,给报纸写评论 。 可是普及的东西竟然连我都看不懂
, 不知道美国大众是怎么看的。


https://www.nytimes.com/2002/05/12/style/weddings-caroline-rosenthal-andrew-
gelman.html

Mrs. Gelman, 36, is an assistant professor of social work at New York
University. She graduated summa cum laude from Harvard, received a master's
degree in social work from the University of California at Berkeley and a Ph
.D. in social work from Smith College. Her father is Guatemala's ambassador
to the United Nations. Her mother, who was a cytopathologist in Guatemala,
is a docent at the Metropolitan Museum of Art in New York.

Mr. Gelman, 37, is a professor of statistics at Columbia University in New
York. He graduated from the Massachusetts Institute of Technology and
received a Ph.D. in statistics from Harvard. His mother retired as an
economist for the Bureau of Labor Statistics and his father, also retired,
was a physicist in the enforcement division of the Environmental Protection
Agency, both in Washington.
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 205.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 50 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 14:06:00 2019, 美东)

贝叶斯标准教科书的作者,stan也是贝叶斯标准工具,在一般人概念里面就算是大佬了。

【 在 magliner (magliner) 的大作中提到: 】
: andrew gelman我有印象, 他和他内人是同行.  这人是不是大佬不敢说, 最大的贡献
: 我看就是向大众普及统计与政治,给报纸写评论 。 可是普及的东西竟然连我都看不懂
: , 不知道美国大众是怎么看的。
: https://www.nytimes.com/2002/05/12/style/weddings-caroline-rosenthal-
andrew-
: gelman.html
: Mrs. Gelman, 36, is an assistant professor of social work at New York
: University. She graduated summa cum laude from Harvard, received a master'
s
: degree in social work from the University of California at Berkeley and a
Ph
: .D. in social work from Smith College. Her father is Guatemala's
ambassador
: to the United Nations. Her mother, who was a cytopathologist in Guatemala,
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 12.]

 
dracodoc
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 51 ]

发信人: dracodoc (david), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 15:29:38 2019, 美东)

最终底层还是都得C/Fortran,clojure通过java再JNI绑定稍微麻烦了一些,现在会用
JNI愿意干这个的估计很少了。

【 在 hci (海螺子) 的大作中提到: 】
: 唯一的劣势是Clojure作ML计算的人少。
: 是的,龙哥的东西都是JNI。
: 他搞Neanderthal是为了搞贝叶斯统计推理,Bayadera,他的这个Clojure写的库,比最
: 常用的用C++写的stan,要快好几个数量级。
: Bayadera:
: 61,208,576 samples in 267 ms.
: 4.36 ns per (computationally heavy) sample
: JAGS/Stan (state-of-the-art bayesian C++ tools):
: 20,000 samples in 180/485 seconds
: 9 ms per sample
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 52 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 23:07:22 2019, 美东)

这个checksum程序,我是在公司的一个server上启动nrepl,然后远程连接算的。这个
server应该是个linux VM,内存64G,但是CPU可能不行,不太清楚,可能是两核。总体
性能不算太好。

我又在我的笔记本上算了一下,我的是Lenovo X1 Carbon,16G,i7。算了三次:

=> (time (checksum))
"Elapsed time: 33621.172758 msecs"
30400
=> (time (checksum))
"Elapsed time: 32312.985197 msecs"
30400
"Elapsed time: 35642.223498 msecs"
30400

不经优化它这个速度一般。

【 在 hci (海螺子) 的大作中提到: 】
: 你这个checksum, 我的是13秒多。你的机器比我的慢这么多么?我的是2014年的
: MacBook Pro,很老的机器了。
: MacBook Pro (Retina, 13-inch, Mid 2014) 2.8 GHz Intel Core i5
: "Elapsed time: 13717.127682 msecs"



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 53 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 23:11:53 2019, 美东)


这个是轻度优化的Clojure,在我的Lenovo X1 Carbon上速度14秒左右,算了三次:
"Elapsed time: 14561.482745 msecs"
30400
"Elapsed time: 13617.078942 msecs"
30400
"Elapsed time: 14432.821794 msecs"
30400


【 在 hci (海螺子) 的大作中提到: 】
: 因为Clojure是lazy的,刚才的benchmark的确是没有算出所有的值。为了比较,都用命
: 令行,并且打印出吧。
: time python src/test/knight.py
: real    0m15.619s
: user    0m14.760s
: sys    0m0.113s
: time clj -m test.knight
: real    0m12.136s
: user    0m14.683s
: sys    0m0.619s
: ...................




--
※ 修改:·TheMatrix 於 Mar 14 23:35:08 2019 修改本文·[FROM: 50.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 54 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Thu Mar 14 23:28:20 2019, 美东)

python checksum 是这样的,在我的X1 Carbon上算三次:

23:24:28
23:24:43
30400

23:26:26
23:26:41
30400

23:27:02
23:27:18
30400

15秒左右,比轻度优化的clojure慢一点点。

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 这个checksum程序,我是在公司的一个server上启动nrepl,然后远程连接算的。这个
: server应该是个linux VM,内存64G,但是CPU可能不行,不太清楚,可能是两核。总体
: 性能不算太好。
: 我又在我的笔记本上算了一下,我的是Lenovo X1 Carbon,16G,i7。算了三次:
: => (time (checksum))
: "Elapsed time: 33621.172758 msecs"
: 30400
: => (time (checksum))
: "Elapsed time: 32312.985197 msecs"
: 30400
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 55 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar 15 14:30:42 2019, 美东)

这个时间我觉得不对。

我试了一下dim=6,Clojure至少几分钟算不完。当然python也算不完。我用java试了一
下,java算dim=5非常快,一秒钟左右,但是算dim=6我算了4分钟左右,没算完,我把
它停下了。

【 在 hci (海螺子) 的大作中提到: 】
: python code is choked when dim=6, have to Ctrl-C to kill after 5 min.
: clojure code finish in less 3.4154 seconds.




--
☆ 发自 iPhone 买买提 1.24.09
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:1d9e:]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 56 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar 15 19:43:47 2019, 美东)

这个题目Clojure与Java速度差异很大,可能是因为这个题目主要看内存allocation速
度,要把一个[0 0],一步一步变成304*25*2的多重嵌套数据结构,还要求全部realize
in memory,这个对immutable data structure压力有点大。 实用程序中,这种要求
并不常见,Clojure lazy by default会让实际使用显得更快。

实际应用中,idiomatic Clojure与Java应该是1.1-8X速度差异。比如这个Web
benchmark

https://www.techempower.com/benchmarks/#section=data-r17&hw=cl&test=fortune&
l=zijzaz-1

用云的机器,如果最快的Java框架速度为100的话,最快的Clojure框架和Python框架结
果如下:

任务,  Clojure, Python
JSON serialization, 73, 92
Single DB query, 28, 14
Multiple DB queries, 42, 31
Fortunes Cookie, 34, 17
DB updates, 19, 29
Plain tex, 33, 33

用物理机器的结果:

任务,  Clojure, Python
JSON serialization, 93, 95
Single DB query, 31, 15
Multiple DB queries, 53, 35
Fortunes Cookie, 30, 21
DB updates, 13, 19
Plain tex, 60, 38



【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 这个时间我觉得不对。
: 我试了一下dim=6,Clojure至少几分钟算不完。当然python也算不完。我用java试了一
: 下,java算dim=5非常快,一秒钟左右,但是算dim=6我算了4分钟左右,没算完,我把
: 它停下了。







--
※ 修改:·hci 於 Mar 15 20:22:30 2019 修改本文·[FROM: 73.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 73.]

 
hci
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 57 ]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Fri Mar 15 19:44:37 2019, 美东)

Clojure is lazy, didn't not complete all computation.

【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 这个时间我觉得不对。
: 我试了一下dim=6,Clojure至少几分钟算不完。当然python也算不完。我用java试了一
: 下,java算dim=5非常快,一秒钟左右,但是算dim=6我算了4分钟左右,没算完,我把
: 它停下了。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 73.]

 
guvest
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 58 ]

发信人: guvest (我爱你老婆Anna), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sat Mar 16 04:17:59 2019, 美东)

我這幾天在弄一個聲音分析的算法。感到jvm數值計算的速度穩定性很差。时快时慢。
算法放到android手機反而穩定性好一些。也許是我不懂配置jvm参数的缘故。


【 在 hci(海螺子) 的大作中提到: 】
<br>: Clojure is lazy, didn't not complete all computation.
<br>
--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 47.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 59 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sat Mar 16 23:20:13 2019, 美东)

递归函数的两条线不对称,确实是主要问题。两条线可以对称,这就要考虑对称的目标
对象是什么。最终目标是path collection,那么对称的目标对象也是path collection
。当前(path,pos)向前发展的几个子path,各返回子path collection,汇总成为当前(
path,pos)应返回的path collection:

(def moves [[1 2] [2 1] [-1 2] [2 -1] [1 -2] [-2 1] [-1 -2] [-2 -1]])
(def dim 5)

(defn possible-pos [path]
    (let [seen (set path) pos (last path)]
        (->> moves
            (map #(map + pos %))
            (filter (fn [[x y]] (and (>= x 0) (>= y 0) (< x dim) (< y dim))))
            (remove #(seen %)))))

(defn jump [path]
    (if (= (count path) (* dim dim))
        (list path)
        (for [pos (possible-pos path)
                fpath (jump (conj path pos))]
            fpath)))

(defn checksum []
    (reduce +
        (for [path (jump [[0 0]]) pos path coord pos]
            coord)))



【 在 pseudo (small man) 的大作中提到: 】
: 在你的例子里,递归函数(jump)的两条线是不对称的。严格说来,每条线的返回值的
: 类型不一样,所以有你描述的这种情况出现。前面我修改的一个主要方向就是把类型统
: 一起来。
: 另外,FP主要考虑值的运算。比如在Python里,大家都考虑print就好。但是,在
: Clojure就需要思考如何把这些值收集起来。



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

 
TheMatrix
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 60 ]

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sun Mar 17 00:00:56 2019, 美东)

Python改为这样:
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]


此主题相关图片如下:

[删除]

[首页][上页] [下页][末页] [分页:1 2 3 4 ]
[快速返回] [ 进入葵花宝典讨论区] [返回顶部]
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996