假设我有
val foo : Seq[Double] = ...
val bar : Seq[Double] = ...
Run Code Online (Sandbox Code Playgroud)
我希望产生一个seq,其中baz(i)= foo(i)+ bar(i).我能想到的一种方法是
val baz : Seq[Double] = (foo.toList zip bar.toList) map ((f: Double, b : Double) => f+b)
Run Code Online (Sandbox Code Playgroud)
然而,这感觉既丑陋又低效 - 我必须将seqs转换为列表(使用惰性列表进行爆炸),创建此临时元组列表,仅映射它并让它进行GCed.也许溪流解决了懒惰的问题,但无论如何,这感觉就像不必要的丑陋.在lisp中,map函数将映射多个序列.我会写的
(mapcar (lambda (f b) (+ f b)) foo bar)
Run Code Online (Sandbox Code Playgroud)
并且不会在任何地方创建临时列表.在Scala中是否存在map-over-multiple-lists函数,或者zip是否与解构相结合实际上是"正确"的方法?
我正在尝试使用IPython的并行环境,到目前为止,它看起来很棒,但我遇到了问题.让我们说我有一个在库中定义的函数
def func(a,b):
...
Run Code Online (Sandbox Code Playgroud)
当我想要评估a的一个值和b的一堆值时,我使用的.
[func(myA, b) for b in myLongList]
Run Code Online (Sandbox Code Playgroud)
显然,真正的功能更复杂,但问题的实质是它需要多个参数,我只想映射其中一个.问题是map,@ dview.parallel等映射了所有参数.
所以我想说我想得到func(myA,myLongList)的答案.这样做的显而易见的方法是咖喱,或者是functools.partial,或者是
dview.map_sync(lambda b: func(myA, b), myLongList)
Run Code Online (Sandbox Code Playgroud)
但是,这在远程计算机上无法正常工作.原因是当lambda表达式被pickle时,myA的值不包括在内,而是使用远程机器上本地作用域的myA值.当闭包被腌制时,它们关闭的变量不会.
我能想到的两种实际工作方式是为每个参数手动构建列表,并对所有参数进行映射工作,
dview.map_sync(func, [myA]*len(myLongList), myLongList)
Run Code Online (Sandbox Code Playgroud)
或者以恐怖的方式将数据用作函数的默认参数,强制它被腌制:
# Can't use a lambda here b/c lambdas don't use default arguments :(
def parallelFunc(b, myA = myA):
return func(myA, b)
dview.map_sync(parallelFunc, myLongList)
Run Code Online (Sandbox Code Playgroud)
真的,当真正的函数需要很多参数并且更复杂时,这一切似乎都非常扭曲.是否有一些惯用的方法呢?就像是
@parallel(mapOver='b')
def bigLongFn(a, b):
...
Run Code Online (Sandbox Code Playgroud)
但据我所知,没有像'mapOver'这样的东西存在.我可能已经知道如何实现它...这只是一个非常基本的操作,应该存在支持,所以我想检查我是否遗漏了一些东西.
我正在尝试编写一些需要执行以下操作的Scala代码:
class Test[Type] {
def main {
SomeFunc classOf[Type]
val testVal: Type = new Type()
}
}
Run Code Online (Sandbox Code Playgroud)
而且它失败了.我显然不了解Scala泛型参数.显然,误解是在C++中,模板本质上就像字符串替换一样,所以只要传入的类具有默认构造函数,新的Type()就可以工作.但是,在Scala中,类型是不同类型的对象.
我经常想要更改到特定可执行文件所在的目录.所以我喜欢类似的东西
cd `which python`
Run Code Online (Sandbox Code Playgroud)
切换到安装python命令的目录.但是,这显然是非法的,因为cd占用目录,而不是文件.显然有一些regexp-foo我可以做的去除文件名,但这会打败它是一个简单的单行.
我知道map函数接受列表的每个元素(一个序列)并将一个函数应用于它.递归(并且不考虑终止条件等)
map(s, f) = f(s.head) :: map(s.tail, f)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个像这样的功能
foo(s, f) = f(s) :: map(s.tail, f).
Run Code Online (Sandbox Code Playgroud)
所以'mapper'是在子列表而不是单个元素上调用映射函数的地方.在lisp术语中,我正在寻找一个地图列表,而不是mapcar.这样的事情是存在的,还是我必须自己滚动(或使用递归)?
或者,我将采用一个函数,将序列作为输入,并返回一系列中到端子序列,即
bar(s, f) = s :: bar(s.tail, f)
Run Code Online (Sandbox Code Playgroud) 我在一些相对较大的数据上使用R并且遇到了一些内存问题.这是在Linux上.我的数据明显少于系统上的可用内存,因此这是管理瞬态分配的问题.
当我运行gc()时,我得到以下列表
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 2147186 114.7 3215540 171.8 2945794 157.4
Vcells 251427223 1918.3 592488509 4520.4 592482377 4520.3
Run Code Online (Sandbox Code Playgroud)
但是R似乎在驻留内存中分配了4GB,在交换中分配了2GB.我假设这是操作系统分配的内存,R的内存管理系统将根据需要分配和GC.但是,让我说我不想让R OS分配超过4gb,以防止交换抖动.我总是可以使用ulimit,但之后它会崩溃而不是在缩小的空间内工作并且更频繁地使用GCing.有没有办法为gc触发器指定任意最大值并确保R从不进行os分配更多?或者我还能做些什么来管理内存使用?
以下是一个玩具问题,可以解释我的问题.
我有一个包含大量员工的数据框; 对于每个员工,它有一个名称,工资,性别和州.
aggregate(salary ~ state) # Returns the average salary per state
aggregate(salary ~ state + gender, data, FUN = mean) # Avg salary per state/gender
Run Code Online (Sandbox Code Playgroud)
我实际需要的是每个州妇女所获总薪水的比例摘要.
aggregate(salary ~ state + gender, data, FUN = sum)
Run Code Online (Sandbox Code Playgroud)
返回每个州的女性(和男性)所获得的总薪水,但我真正需要的是每州一级的salary_w/salary_total.我可以写一个for循环等 - 但我想知道是否有一些方法可以使用聚合来做到这一点.
我有兴趣创建一个我可以使用的类
class MyClass {
vector<int> m_vec;
public:
// Either this
const& vector<int> vec;
// Or some version of this.
const& vector<int> getVec() { return m_vec } ;
MyClass() : vec(m_vec) {}
void changeVec() { m_vec.push_back(5); }
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想使用getVec(),语法有点麻烦:
myClass.getVec()[5]
Run Code Online (Sandbox Code Playgroud)
我更愿意能够以某种方式使用
myClass.vec[5]
Run Code Online (Sandbox Code Playgroud)
没有暴露修改载体的能力.IE,我希望成员变量是私有的,但是变量的const版本是公共的,没有语法或性能开销.
如果我添加const&vector引用,编译器(至少我的GCC版本)实际上会使该类占用更多内存.所以
为了清楚起见,这是一个例子 - 在实际情况中,使用比矢量情况更具吸引力.此外,内存使用很重要,因为存在大量这些对象并将被复制,因此这不是过早的优化.此时,我正在使用getVec()[0]方法,但是丑陋会让我感到害怕.