在Clojure中,在(有限的,不是太大的)seq上设置滑动窗口最好的方法是什么?我应该只使用drop并take跟踪当前的指数,还是有一种我错过的更好的方式?
我正在使用Sesame库在内存中的三重存储上运行SPARQL查询.
我正在使用Clojure来实现这一目标.
查询结果是一个类似自定义Iterator的[1]对象,因此clojure seq不能在开箱即用的情况下工作.
将自定义java Iterator类似对象转换为clojure序列的最优雅方法是什么?
我想到的最明显和最愚蠢的想法是循环它并建立一个clojure向量,但我确信有更优雅的方法来解决这个问题.
[1] http://www.openrdf.org/doc/sesame2/api/info/aduna/iteration/Iteration.html
这个FAQ说明了这一点
seq运算符是
Run Code Online (Sandbox Code Playgroud)seq :: a -> b -> bx
seqy将评估x,足以检查它是否为底部,然后丢弃结果并评估y.这可能看起来没什么用,但这意味着在考虑y之前保证会对x进行求值.
这对Haskell来说非常好,但它是否意味着在
x `seq` f x
Run Code Online (Sandbox Code Playgroud)
评估费用x将支付两次("丢弃结果")?
我尝试使用Map.map将地图转换为元组列表.然而,这失败了.我做了以下实验:
val m = Map(("a" -> 1), ("b" -> 2))
//> m : scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)
val r1 = m.map{ case (k,v) => v} //> r1 : scala.collection.immutable.Iterable[Int] = List(1, 2)
def toTuple[A,B](a:A,b:B) = (a,b) //> toTuple: [A, B](a: A, b: B)(A, B)
//val r2: List[Tuple2[_,_]] = m.map(e => (e._1,e._2))
val r3 = m.map(e => toTuple(e._1,e._2)) //> r3 : scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)
val r4 = m.toSeq //> r4 : Seq[(String, …Run Code Online (Sandbox Code Playgroud) 我今天尝试使用Seq.first,并且编译器说它已经被弃用而不支持Seq.tryPick.它表示它应用了一个函数并返回返回Some的第一个结果.我想我可以说有趣的x - > x!= 0因为我知道第一个会在我的情况下返回一些,但是放在这里的适当约束是什么?什么是正确的语法?
为了澄清,我想以下列格式使用它:
let foo(x:seq<int>) =
x.filter(fun x -> x>0)
|> Seq.tryPick (??)
Run Code Online (Sandbox Code Playgroud) 我一直在F#做一些计算密集型的工作.功能类似于Array.Parallel.map其使用.NET任务并行库加快了我的代码成倍的真的很最小的努力.
但是,由于内存问题,我重新编写了我的代码的一部分,以便可以在序列表达式中进行延迟评估(这意味着我必须存储并传递较少的信息).到了评价我用的时候:
// processor and memory intensive task, results are not stored
let calculations : seq<Calculation> = seq { ...yield one thing at a time... }
// extract results from calculations for summary data
PSeq.iter someFuncToExtractResults results
Run Code Online (Sandbox Code Playgroud)
代替:
// processor and memory intensive task, storing these results is an unnecessary task
let calculations : Calculation[] = ...do all the things...
// extract results from calculations for summary data
Array.Parallel.map someFuncToExtractResults calculations
Run Code Online (Sandbox Code Playgroud)
当使用任何Array.Parallel函数时,我可以清楚地看到我的计算机上的所有内核都启动(CPU使用率约为100%).但是,所需的额外内存意味着程序永远不会完成.
在运行程序时使用PSeq.iter版本,CPU使用率仅为8%(并且RAM使用率最低).
那么:PSeq版本运行得如此之慢有什么原因吗?是因为懒惰的评价?我错过了一些神奇的"平行"的东西吗?
谢谢,
其他资源,两者的源代码实现(它们似乎在.NET中使用不同的并行库):
https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/array.fs
https://github.com/fsharp/powerpack/blob/master/src/FSharp.PowerPack.Parallel.Seq/pseq.fs …
parallel-processing f# lazy-evaluation seq task-parallel-library
在F#中考虑以下代码:
let n = 10000000
let arr = Array.init n (fun _ -> 0)
let rec buildList n acc i = if i = n then acc else buildList n (0::acc) (i + 1)
let lst = buildList n [] 0
let doNothing _ = ()
let incr x = x + 1
#time
arr |> Array.iter doNothing // this takes 14ms
arr |> Seq.iter doNothing // this takes 74ms
lst |> List.iter doNothing // this takes 19ms
lst |> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用printf和seq打印以下模式:
0000
0001
0002
0003
Run Code Online (Sandbox Code Playgroud)
我的问题是我曾经使用过:
seq 0 10 | xargs printf %04d
Run Code Online (Sandbox Code Playgroud)
我的所有输出格式化为相同的行likeo:
0000000100020003
Run Code Online (Sandbox Code Playgroud)
我仍然无法使用xargs.在这种情况下如何正确使用它?
我需要得到这个:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 0 2 0 3 0 4 0 5
[2,] 0 0 0 0 0 0 0 0 0
[3,] 6 0 7 0 8 0 9 0 10
[4,] 0 0 0 0 0 0 0 0 0
[5,] 11 0 12 0 13 0 14 0 15
[6,] 0 0 0 0 0 0 0 0 0
[7,] 16 0 17 0 18 0 19 0 20 …Run Code Online (Sandbox Code Playgroud) Perl 6有懒惰列表,但它也有无界的Range对象.您应该选择哪一个按整数计算?
并且有两个点的无界范围:
0 .. *
Run Code Online (Sandbox Code Playgroud)
有三个点的Seq(序列):
0 ... *
Run Code Online (Sandbox Code Playgroud)
A Range使用它们的自然顺序生成连续的东西列表.它继承自Iterable,但也是Positional,因此您可以索引范围.您可以检查是否有某些内容Range,但这不是任务的一部分.
Seq只要它知道如何到达下一个元素,A 就可以生成你喜欢的任何东西.它继承自Iterable,还有PositionalBindFailover,它Positional通过缓存和列表转换来伪造东西.如果你只是从一个元素转移到另一个元素,我认为这不是什么大问题.
我在这上面来回走动.目前我在想它的范围.