我编写了一个Agda函数applyPrefix,将固定大小的矢量函数应用于矢量大小的较长矢量的初始部分m,n并且k 可能保持隐式.这是定义和辅助函数split:
split : ? {A m n} ? Vec A (n + m) ? (Vec A n) × (Vec A m)
split {_} {_} {zero} xs = ( [] , xs )
split {_} {_} {suc _} (x ? xs) with split xs
... | ( ys , zs ) = ( (x ? ys) , zs )
applyPrefix : ? {A n m k} ? (Vec A n ? …Run Code Online (Sandbox Code Playgroud) 我测试了并行化(几乎)"令人难以置信的并行"(即完全可并行化)算法的性能增益,该算法总结了第一个N整数:
串行算法很简单:
N = 100000000
print sum(range(N))
Run Code Online (Sandbox Code Playgroud)
我的双核笔记本电脑(联想X200)的执行时间:0m21.111s.
并行化(带mpi4py)版本使用3个节点; 节点0计算整数的下半部分之和,节点1计算上半部分的总和.两者都将结果(via comm.send)发送到节点2,节点2汇总两个数字并打印结果:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
N = 100000000
if rank == 0:
s = sum(range(N/2))
comm.send(s,dest=2,tag=11)
elif rank == 1:
s = sum(range(N/2+1,N))
comm.send(s,dest=2,tag=11)
elif rank == 2:
s1 = comm.recv(source=0, tag=11)
s2 = comm.recv(source=1, tag=11)
print s1+s2
Run Code Online (Sandbox Code Playgroud)
我的双核笔记本电脑的两个核心都被充分利用; 执行时间现在:15.746s.
我的问题:至少在理论上,执行时间几乎应该减半.哪个开销吃了4秒?(当然不是s1 + s2).那些发送/接收命令是否耗时?
编辑:在阅读了答案并重新思考问题之后,我认为4秒(在某些运行中甚至更多)被生成两个长度为50000000的列表所导致的高内存流量所吞噬; 我的笔记本电脑的两个核心共享一个公共内存(至少是主内存;我认为它们有独立的L2缓存),这正是瓶颈:因此,两个内核通常都希望同时访问内存(以获取内存)下一个列表元素),其中一个必须等待...
如果我使用xrange而不是range,则会延迟生成下一个列表元素并分配很少的内存.我测试了它并运行与上面相同的程序,xrange仅需11秒!
我想实现一个带有arr-member-function 的箭头,显示不同类型的函数参数的不同行为,例如arr (\x -> (x,x))应该表现得与arr id... 不同
这是代码:
{-# LANGUAGE Arrows, OverlappingInstances, IncoherentInstances, FlexibleInstances#-}
import Control.Arrow
import Control.Category
import Prelude hiding (id, (.))
class ToPredefinedStr a where
toStr :: a -> String
instance ToPredefinedStr ((->) b (b,b)) where
toStr _ = "b -> (b,b)"
instance ToPredefinedStr (a -> (b,c)) where
toStr _ = "a -> (b,c)"
instance ToPredefinedStr ((a,b) -> c) where
toStr _ = "(a,b) -> c"
instance ToPredefinedStr (a -> b) where …Run Code Online (Sandbox Code Playgroud) 我在bash的文件模式中遇到了以下恕我直言的奇怪行为:
$ ls
Basic1 datei1 datie2 sdfl
$ ls [a-z]*
Basic1 datei1 datie2 sdfl
$ ls [abcdefghijklmnopqrstuvwxyz]*
datei1 datie2 sdfl
Run Code Online (Sandbox Code Playgroud)
为什么范围的模式[a-z]不区分大小写?错误或功能?
注意:
bash-Option nocaseglob是off(否则,上面给出的第二种模式也应该不区分大小写......):
$ shopt nocaseglob
nocaseglob off
Run Code Online (Sandbox Code Playgroud)我的bash版本:
$ bash --version
GNU bash, Version 4.2.24(1)-release (i686-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)GNU bash,版本4.2.24(1) - release(i686-pc-linux-gnu)
我得到了以下数据框,描述了不同德国地区的年龄结构:
我想用R中的ggplot每行绘制一行.通过R中的matplot的简单解决方案是:
matplot(t(df61[,-c(1,2)], type="l"))
Run Code Online (Sandbox Code Playgroud)
产量:
但它如何与ggplot一起使用.我明白了,我必须将数据帧转换为扁平形式:
library("reshape2")
df61_long <- melt(df61[,-2], id.vars = "NAME")
Run Code Online (Sandbox Code Playgroud)
这给了我:
我认为通过ggplot的解决方案应该是这样的:
ggplot(df61_long, aes(x = "variable", y = "value")) + geom_line(aes(colors = "NAME"))
Run Code Online (Sandbox Code Playgroud)
但是,它会产生一个空坐标系.我做错了什么?