小编Geo*_*ing的帖子

这个Scala代码可以使用更少的内存吗?

考虑以下Set基准:

import scala.collection.immutable._

object SetTest extends App {
  def time[a](f: => a): (a,Double) = {
    val start = System.nanoTime()
    val result: a = f
    val end = System.nanoTime()
    (result, 1e-9*(end-start))
  }

  for (n <- List(1000000,10000000)) {
    println("n = %d".format(n))
    val (s2,t2) = time((Set() ++ (1 to n)).sum)
    println("sum %d, time %g".format(s2,t2))
  }
}
Run Code Online (Sandbox Code Playgroud)

编译和运行产生

tile:scalafab% scala SetTest
n = 1000000
sum 1784293664, time 0.982045
n = 10000000
Exception in thread "Poller SunPKCS11-Darwin" java.lang.OutOfMemoryError: Java heap space
...
Run Code Online (Sandbox Code Playgroud)

即,Scala无法在具有8 GB内存的计算机上代表一组1000万个Int.这是预期的行为吗?有没有办法减少内存占用?

memory-management scala set

5
推荐指数
1
解决办法
516
查看次数

如何获得有关 py2app 错误的更多信息?

我正在尝试使用 py2app 打包一个混合的 Python/C++ 应用程序。我的 setup.py 是

from setuptools import setup
setup(app=['voxpopuli.py'],data_files=[],options=
  {'py2app'{'argv_emulation':True}},setup_requires=['py2app'])
Run Code Online (Sandbox Code Playgroud)

我通过调用 py2app

python setup.py py2app --no-strip --iconfile /Users/irving/otherlab/other/bin/OLicon.icns --resources /opt/local/lib/Resources/qt_menu.nib
Run Code Online (Sandbox Code Playgroud)

这在没有警告或错误的情况下完成,但是当我尝试运行结果应用程序时,会弹出一个窗口,上面写着“voxpopuli Error”。它有一个“打开控制台”按钮,但唯一的控制台消息是

9/21/12 11:43:14.691 AM voxpopuli[52765]: voxpopuli Error
9/21/12 11:43:15.926 AM com.apple.launchd.peruser.501[158]: ([0x0-0x177d77c].org.pythonmac.unspecified.voxpopuli[52765]) Exited with code: 255
Run Code Online (Sandbox Code Playgroud)

是否有标准方法可以从 py2app 中获取更多信息以帮助诊断此错误?

py2app

5
推荐指数
1
解决办法
2559
查看次数

什么是C++ typeid的Scala等价物?

例如,如果我这样做

scala> val a = Set(1,2,3)
a: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

在REPL中,我希望看到最精致的"a"类型,以便知道它是否真的是一个HashSet.在C++中,typeid(a).name()会这样做.什么是Scala等价物?

reflection scala typeid

4
推荐指数
1
解决办法
183
查看次数

强制py.test使用已安装的模块版本

我有一个混合的Python/C++库,测试文件混合在同一目录的源文件中.布局看起来像

/home/irving/geode
  geode
    __init__.py
    vector
      __init__.py
      test_vector.py
      ...
    ...
Run Code Online (Sandbox Code Playgroud)

遗憾的是,由于缺少.so扩展模块,因此库无法就地使用. 问题:我是否可以使py.test始终使用已安装的版本,即使从/home/irving/geode或从子目录运行?

测试文件具有from __future__ import absolute_import,并且如果直接作为脚本执行则运行正常.例如,如果我这样做

cd geode/vector
./test_vector.py
Run Code Online (Sandbox Code Playgroud)

它确实import geode找到了已安装的版本.但是,如果我运行py.test geode/vector,它会找到本地副本geode,然后死掉.

pytest

4
推荐指数
1
解决办法
998
查看次数

在编译时比较静态字段指针

我有一个派生自A类的B类.A声明一个静态字段f,B可能声明一个相同名称的类似字段.以下不起作用:

struct A { static int f; };
struct B : A { static int f; }; // A::f is different from B::f
struct C : A {}; // A::f is the same as C::f
BOOST_STATIC_ASSERT((&A::f != &B::f));
BOOST_STATIC_ASSERT((&A::f == &C::f));
Run Code Online (Sandbox Code Playgroud)

尽管理论上这些断言可以在编译时检查,但是由于常量表达式不能接受地址,所以它们是不允许的.

有没有办法在编译时进行这种检查工作?

c++ static-assert

3
推荐指数
1
解决办法
424
查看次数

安全,检查强制转换为C++基类而不使用额外的行

假设我有B从类继承的类A,并考虑以下代码:

void f(B& b) {
  A& a = b;
  g(a);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免演员的额外线?请注意,以下static_cast版本不相同,因为除了向下转换之外它还允许向上转换:

// Potentially dangerous: doesn't check that B inherits from A
void f(B& b) {
  g(static_cast<A&>(b));
}
Run Code Online (Sandbox Code Playgroud)

编辑:我不能依靠隐式强制来完全避免演员阵容,就像Brian的回答一样.今天的原因是g模板,我想避免不必要的实例化,但过去还有其他原因.在任何情况下,我都需要某种显式转换来获取类型的值A&.

c++ casting

3
推荐指数
1
解决办法
205
查看次数

numpy-convertible类可以从序列内部正确转换为ndarray吗?

__array__方法允许自定义类型自动转换为numpy。例如,

>>> class Convertible:
...  def __array__(self):
...    return np.zeros(7)
>>> np.array(Convertible())
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.])
Run Code Online (Sandbox Code Playgroud)

不幸的是,__array__如果自定义类型出现在序列中,则无法使用:

>>> np.array([Convertible(), Convertible()])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: float() argument must be a string or a number, not 'Convertible'
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以解决Convertible,以将Convertible对象序列转换为numpy与np.array转换每个对象然后转换结果序列相同ndarrays

numpy

3
推荐指数
1
解决办法
134
查看次数