考虑以下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.这是预期的行为吗?有没有办法减少内存占用?
我正在尝试使用 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 中获取更多信息以帮助诊断此错误?
例如,如果我这样做
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等价物?
我有一个混合的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,然后死掉.
我有一个派生自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)
尽管理论上这些断言可以在编译时检查,但是由于常量表达式不能接受地址,所以它们是不允许的.
有没有办法在编译时进行这种检查工作?
假设我有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&.
该__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?